/ Hex Artifact Content
Login

Artifact 896e95aa2dcb74d5b951a87be4eec811617c835b:


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 33 37  : pager.c,v 1.37
0350: 30 20 32 30 30 37 2f 30 38 2f 32 33 20 31 31 3a  0 2007/08/23 11:
0360: 34 37 3a 35 39 20 64 61 6e 69 65 6c 6b 31 39 37  47:59 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 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0690: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
06a0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
06b0: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
06c0: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
06d0: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
06e0: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
06f0: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0700: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ument..*/.#defin
0710: 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69  e PAGERID(p) ((i
0720: 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66  nt)(p->fd)).#def
0730: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0740: 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a  (fd) ((int)fd)..
0750: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  /*.** The page c
0760: 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20  ache as a whole 
0770: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65  is always in one
0780: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0790: 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  g.** states:.**.
07a0: 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43  **   PAGER_UNLOC
07b0: 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  K        The pag
07c0: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63  e cache is not c
07d0: 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67  urrently reading
07e0: 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   or .**         
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
0800: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0810: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20  se file.  There 
0820: 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  is no.**        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0840: 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  ata held in memo
0850: 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ry.  This is the
0860: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20   initial.**     
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
0890: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
08a0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
08b0: 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74  che is reading t
08c0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73        Writing is
08f0: 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
0900: 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   There can be.**
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
0930: 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e  readers accessin
0940: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
0950: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
0970: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0980: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  me..**.**   PAGE
0990: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20  R_RESERVED      
09a0: 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73  This process has
09b0: 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61   reserved the da
09c0: 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69  tabase for writi
09d0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
09f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  has not yet made
0a00: 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f   any changes.  O
0a10: 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a  nly one process.
0a20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a30: 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69           at a ti
0a40: 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74  me can reserve t
0a50: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
0a60: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0a90: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
0aa0: 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72  odified so other
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0ad0: 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  ses may still be
0ae0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d   reading the on-
0af0: 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  disk.**         
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0b10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
0b20: 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55  **   PAGER_EXCLU
0b30: 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67  SIVE     The pag
0b40: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0b50: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0b60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b70: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0b80: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0b90: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0ba0: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0bc0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0bd0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0be0: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0c10: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  riting..**.**   
0c20: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
0c30: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f      The pager mo
0c40: 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74  ves to this stat
0c50: 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43  e from PAGER_EXC
0c60: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20  LUSIVE.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20  after all dirty 
0c90: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
0cb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cc0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0cd0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
0ce0: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
0cf0: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0d10: 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65  isk. All that re
0d20: 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74  mains to do is t
0d30: 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20  o remove or.**  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74 68       truncate th
0d60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
0d70: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d80: 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  on .**          
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c               wil
0da0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  l be committed..
0db0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0dc0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0dd0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0de0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0df0: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0e00: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0e10: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0e20: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e30: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e40: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e50: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e60: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e70: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e80: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e90: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0ea0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0eb0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0ec0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ed0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0ee0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ef0: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f00: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f10: 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  hat sqlite3Pager
0f20: 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  Write() can only
0f30: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f40: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f50: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f70: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f80: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0f90: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0fa0: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0fb0: 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45  ED.).** PAGER_RE
0fc0: 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61  SERVED means tha
0fd0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70  t there is an op
0fe0: 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  en rollback jour
0ff0: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e  nal..** The tran
1000: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1010: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1020: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1030: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
1040: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1050: 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69  file, though wri
1060: 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  tes to the rollb
1070: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f  ack.** journal o
1080: 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74 20  ccurs with just 
1090: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
10a0: 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65   After an sqlite
10b0: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
10c0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61  .** or sqlite3Pa
10d0: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
10e0: 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 63  o(), the state c
10f0: 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41  an go back to PA
1100: 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f  GER_SHARED,.** o
1110: 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61 74  r it can stay at
1120: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1130: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65 78   if we are in ex
1140: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
1150: 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ode..*/.#define 
1160: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
1170: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
1180: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20  R_SHARED      1 
1190: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41    /* same as SHA
11a0: 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  RED_LOCK */.#def
11b0: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
11c0: 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d  ED    2   /* sam
11d0: 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f  e as RESERVED_LO
11e0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
11f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
1200: 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45  4   /* same as E
1210: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f  XCLUSIVE_LOCK */
1220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1230: 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a  YNCED      5../*
1240: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
1250: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1260: 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65  LOCK macro is se
1270: 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d  t to true at com
1280: 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68  pile-time,.** th
1290: 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70  en failed attemp
12a0: 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73 65  ts to get a rese
12b0: 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69  rved lock will i
12c0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
12d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
12e0: 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75   is off by defau
12f0: 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c  lt.  To see why,
1300: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1310: 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
1320: 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65  :.** .** Suppose
1330: 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61 64   thread A alread
1340: 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  y has a shared l
1350: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20  ock and wants a 
1360: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a  reserved lock..*
1370: 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65 61  * Thread B alrea
1380: 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76 65  dy has a reserve
1390: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
13a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13b0: 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20  ck.  If.** both 
13c0: 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69 6e  threads are usin
13d0: 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61 6c  g their busy cal
13e0: 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74  lbacks, it might
13f0: 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a   be a long time.
1400: 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ** be for one of
1410: 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69 76   the threads giv
1420: 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20  e up and allows 
1430: 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f  the other to pro
1440: 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20  ceed..** But if 
1450: 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69 6e  the thread tryin
1460: 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 73  g to get the res
1470: 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73  erved lock gives
1480: 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28   up quickly.** (
1490: 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f  if it never invo
14a0: 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61 6c  kes its busy cal
14b0: 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20  lback) then the 
14c0: 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20  contention will 
14d0: 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71  be.** resolved q
14e0: 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64  uickly..*/.#ifnd
14f0: 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ef SQLITE_BUSY_R
1500: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64  ESERVED_LOCK.# d
1510: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53  efine SQLITE_BUS
1520: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1530: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1540: 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64  This macro round
1550: 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74  s values up so t
1560: 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  hat if the value
1570: 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69   is an address i
1580: 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65  t.** is guarante
1590: 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72  ed to be an addr
15a0: 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67  ess that is alig
15b0: 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65  ned to an 8-byte
15c0: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64   boundary..*/.#d
15d0: 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47  efine FORCE_ALIG
15e0: 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29  NMENT(X)   (((X)
15f0: 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45  +7)&~7)../*.** E
1600: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d  ach in-memory im
1610: 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62 65  age of a page be
1620: 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66 6f  gins with the fo
1630: 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e 0a  llowing header..
1640: 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 69  ** This header i
1650: 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20 74  s only visible t
1660: 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f 64  o this pager mod
1670: 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e 74  ule.  The client
1680: 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63 61  .** code that ca
1690: 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20 6f  lls pager sees o
16a0: 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68 61  nly the data tha
16b0: 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65  t follows the he
16c0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65  ader..**.** Clie
16d0: 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63  nt code should c
16e0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
16f0: 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67  Write() on a pag
1700: 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e  e prior to makin
1710: 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63  g.** any modific
1720: 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70  ations to that p
1730: 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  age.  The first 
1740: 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61 67 65  time sqlite3Page
1750: 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63  rWrite().** is c
1760: 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69  alled, the origi
1770: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
1780: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
1790: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  to the rollback.
17a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  ** journal and P
17b0: 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61  gHdr.inJournal a
17c0: 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  nd PgHdr.needSyn
17d0: 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65  c are set.  Late
17e0: 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a  r, once.** the j
17f0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20  ournal page has 
1800: 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65  made it onto the
1810: 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50   disk surface, P
1820: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a  gHdr.needSync.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68   is cleared.  Th
1840: 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  e modified page 
1850: 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65  cannot be writte
1860: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
1870: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1880: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
1890: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
18a0: 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  s has been synce
18b0: 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68  d to disk and th
18c0: 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53  e.** PgHdr.needS
18d0: 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65  ync has been cle
18e0: 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ared..**.** The 
18f0: 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67  PgHdr.dirty flag
1900: 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c   is set when sql
1910: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1920: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
1930: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
1940: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
1950: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
1960: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1970: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1980: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1990: 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d 70 6f   Details of impo
19a0: 72 74 61 6e 74 20 73 74 72 75 63 74 75 72 65 20  rtant structure 
19b0: 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  elements:.**.** 
19c0: 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20  needSync.**.**  
19d0: 20 20 20 49 66 20 74 68 69 73 20 69 73 20 74 72     If this is tr
19e0: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
19f0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
1a00: 66 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  fe to write the 
1a10: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74  page.**     cont
1a20: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
1a30: 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ase because the 
1a40: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1a50: 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20 20 66   needed.**     f
1a60: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61 73 20  or rollback has 
1a70: 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20 74 6f  not by synced to
1a80: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1a90: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 20  ck journal..**  
1aa0: 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20     The original 
1ab0: 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61 76 65  content may have
1ac0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ad0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ae0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62 75 74  urnal.**     but
1af0: 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
1b00: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 53 6f  been synced.  So
1b10: 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69 74 65   we cannot write
1b20: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b30: 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62 65 63  .**     file bec
1b40: 61 75 73 65 20 70 6f 77 65 72 20 66 61 69 6c 75  ause power failu
1b50: 72 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  re might cause t
1b60: 68 65 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  he page in the j
1b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1b80: 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65 61 63     to never reac
1b90: 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49 74 20  h the disk.  It 
1ba0: 69 73 20 61 73 20 69 66 20 74 68 65 20 77 72 69  is as if the wri
1bb0: 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1bc0: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 64 6f  l file.**     do
1bd0: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1be0: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  il the journal f
1bf0: 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
1c00: 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 54 68  *     .**     Th
1c10: 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65  is flag is false
1c20: 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
1c30: 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d 61 74  tent exactly mat
1c40: 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20 20 20  ches what.**    
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1c60: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1c70: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e 65 65  e file.  The nee
1c80: 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  dSync flag is al
1c90: 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73 65 20  so.**     false 
1ca0: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
1cb0: 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
1cc0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1cd0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  main rollback.**
1ce0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64       journal and
1cf0: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
1d00: 20 70 61 67 65 20 72 65 70 72 65 73 65 6e 74 73   page represents
1d10: 20 61 20 6e 65 77 20 70 61 67 65 20 74 68 61 74   a new page that
1d20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
1d30: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
1d40: 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1d50: 61 73 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ase during the c
1d60: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20 74 72  urrent.**     tr
1d70: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6e  ansaction, the n
1d80: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1d90: 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65 20 6f  true until the o
1da0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1db0: 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69 6e 20  .**     size in 
1dc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1dd0: 65 72 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  er has been sync
1de0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1df0: 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a 0a 2a  * inJournal.**.*
1e00: 2a 20 20 20 20 20 54 68 69 73 20 69 73 20 74 72  *     This is tr
1e10: 75 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e  ue if the origin
1e20: 61 6c 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  al page has been
1e30: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1e40: 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20 72 6f  e main.**     ro
1e50: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1e60: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1e70: 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20 70 61  false for new pa
1e80: 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  ges added to.** 
1e90: 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66 20 74      the end of t
1ea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1eb0: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1ec0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
1ed0: 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68 69 73  .**     And this
1ee0: 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74 68 69   flag says nothi
1ef0: 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68 65 72  ng about whether
1f00: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
1f10: 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  nal.**     has b
1f20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1f30: 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73 20 74  sk.  For pages t
1f40: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 6f  hat are in the o
1f50: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 64  riginal.**     d
1f60: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1f80: 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  ession should al
1f90: 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a 2a 2a  ways be true:.**
1fa0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f 75 72  .**       inJour
1fb0: 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1fc0: 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e 6f 2d  InJournal[(pgno-
1fd0: 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28 70 67  1)/8] & (1<<((pg
1fe0: 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a 2a 0a  no-1)%8))!=0.**.
1ff0: 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65  **     The pPage
2000: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20  r->aInJournal[] 
2010: 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20 76 61  array is only va
2020: 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67  lid for the orig
2030: 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65  inal.**     page
2040: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2050: 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73  e, not new pages
2060: 20 74 68 61 74 20 61 72 65 20 61 64 64 65 64 20   that are added 
2070: 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20  to the end.**   
2080: 20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73    of the databas
2090: 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20  e, so obviously 
20a0: 74 68 65 20 61 62 6f 76 65 20 65 78 70 72 65 73  the above expres
20b0: 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  sion cannot be.*
20c0: 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20  *     valid for 
20d0: 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20  new pages.  For 
20e0: 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72  new pages inJour
20f0: 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e  nal is always 0.
2100: 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a  .**.** dirty.**.
2110: 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72 75 65  **     When true
2120: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
2130: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
2140: 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
2150: 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69  en.**     modifi
2160: 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
2170: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
2180: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2190: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20  file..**     If 
21a0: 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20  false, it means 
21b0: 74 68 61 74 20 65 69 74 68 65 72 20 74 68 65 20  that either the 
21c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
21d0: 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e  age is.**     un
21e0: 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20  changed or else 
21f0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75  the content is u
2200: 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77  nimportant and w
2210: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  e do not.**     
2220: 63 61 72 65 20 77 68 65 74 68 65 72 20 6f 72 20  care whether or 
2230: 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73 65 72  not it is preser
2240: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79  ved..**.** alway
2250: 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20  sRollback.**.** 
2260: 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74      This means t
2270: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  hat the sqlite3P
2280: 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
2290: 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65  () API should be
22a0: 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20  .**     ignored 
22b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e 20 20  for this page.  
22c0: 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  The DontRollback
22d0: 28 29 20 41 50 49 20 61 74 74 65 6d 70 74 73 20  () API attempts 
22e0: 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68  to say.**     th
22f0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2300: 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69  f the page on di
2310: 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e  sk is unimportan
2320: 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20  t (it is an.**  
2330: 20 20 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f     unused page o
2340: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 20  n the freelist) 
2350: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 75 6e  so that it is un
2360: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a  necessary to .**
2370: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68       rollback ch
2380: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 70 61  anges to this pa
2390: 67 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ge because the c
23a0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
23b0: 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68  ge.**     can ch
23c0: 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63 68 61  ange without cha
23d0: 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e  nging the meanin
23e0: 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
23f0: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20  e.  This.**     
2400: 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73 20 61  flag overrides a
2410: 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  ny DontRollback(
2420: 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73  ) attempt.  This
2430: 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20   flag is set.** 
2440: 20 20 20 20 77 68 65 6e 20 61 20 70 61 67 65 20      when a page 
2450: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20  that originally 
2460: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20  contained valid 
2470: 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
2480: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72 65 65  .**     the free
2490: 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20  list.  Later in 
24a0: 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
24b0: 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20  tion, this page 
24c0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20  might.**     be 
24d0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20  pulled from the 
24e0: 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75  freelist and reu
24f0: 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e  sed for somethin
2500: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20  g different.**  
2510: 20 20 20 61 6e 64 20 61 74 20 74 68 61 74 20 70     and at that p
2520: 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c  oint the DontRol
2530: 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c  lback() API will
2540: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75   be called becau
2550: 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  se.**     pages 
2560: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66  taken from the f
2570: 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e  reelist do not n
2580: 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63  eed to be protec
2590: 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68  ted by.**     th
25a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
25b0: 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c  al.  But this fl
25c0: 61 67 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ag says that the
25d0: 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20   page was.**    
25e0: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20   not originally 
25f0: 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2600: 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 20  list so that it 
2610: 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a  still needs to.*
2620: 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20  *     be rolled 
2630: 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
2640: 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20   any subsequent 
2650: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
2660: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  alls..**.** need
2670: 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Read .**.**     
2680: 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  This flag means 
2690: 28 77 68 65 6e 20 74 72 75 65 29 20 74 68 61 74  (when true) that
26a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26b0: 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20  the page has.** 
26c0: 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e      not yet been
26d0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
26e0: 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72  k.  The in-memor
26f0: 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73  y content is jus
2700: 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65  t.**     garbage
2710: 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65  .  (Actually, we
2720: 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   zero the conten
2730: 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c  t, but you shoul
2740: 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b  d not.**     mak
2750: 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e  e any assumption
2760: 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  s about the cont
2770: 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ent nevertheless
2780: 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20  .)  If the.**   
2790: 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65    content is nee
27a0: 64 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72  ded in the futur
27b0: 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  e, it should be 
27c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  read from the.**
27d0: 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61       original da
27e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
27f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
2800: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
2810: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
2820: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
2830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2840: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
2850: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
2860: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
2870: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
2880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2890: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
28a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
28b0: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
28c0: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
28d0: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
28e0: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
28f0: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
2900: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
2910: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
2920: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
2930: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
2940: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2970: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e  pages */.  u8 in
2980: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
29a0: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
29b0: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
29c0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20   */.  u8 dirty; 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
29f0: 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  we need to write
2a00: 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f   back changes */
2a10: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61    /* Sync journa
2a40: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
2a50: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2a60: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2a80: 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f  * Disable DontRo
2a90: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69  llback() for thi
2aa0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e  s page */.  u8 n
2ab0: 65 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20  eedRead;        
2ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ad0: 61 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61  ad content if Pa
2ae0: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
2af0: 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20  lled */.  short 
2b00: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b20: 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74  er of users of t
2b30: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
2b40: 48 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50  Hdr *pDirty, *pP
2b50: 72 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20  revDirty;    /* 
2b60: 44 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20  Dirty pages */. 
2b70: 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20   u32 notUsed;   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 2f 2a 20 42 75 66 66 65 72 20 73 70 61 63 65 20  /* Buffer space 
2ba0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2bb0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
2bc0: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
2bd0: 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  dif.  /* pPager-
2be0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
2bf0: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
2c00: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
2c10: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
2c20: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
2c30: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
2c40: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
2c50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61  .};../*.** For a
2c60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  n in-memory only
2c70: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20   database, some 
2c80: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
2c90: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62  n is recorded ab
2ca0: 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65  out.** each page
2cb0: 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73   so that changes
2cc0: 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
2cd0: 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66  ack.  (Journal f
2ce0: 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  iles are not.** 
2cf0: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
2d00: 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20  ry databases.)  
2d10: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  The following in
2d20: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64  formation is add
2d30: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64  ed to.** the end
2d40: 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20   of every EXTRA 
2d50: 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d  block for in-mem
2d60: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ory databases..*
2d70: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d  *.** This inform
2d80: 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ation could have
2d90: 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65   been added dire
2da0: 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64  ctly to the PgHd
2db0: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  r structure..** 
2dc0: 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c  But then it woul
2dd0: 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74  d take up an ext
2de0: 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74  ra 8 bytes of st
2df0: 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50  orage on every P
2e00: 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72  gHdr.** even for
2e10: 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61   disk-based data
2e20: 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e  bases.  Splittin
2e30: 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38  g it out saves 8
2e40: 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a   bytes.  This.**
2e50: 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e   is only a savin
2e60: 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74  gs of 0.8% but t
2e70: 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73  hose percentages
2e80: 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65   add up..*/.type
2e90: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73  def struct PgHis
2ea0: 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a  tory PgHistory;.
2eb0: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
2ec0: 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20   {.  u8 *pOrig; 
2ed0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2ee0: 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74  page text.  Rest
2ef0: 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61  ore to this on a
2f00: 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a   full rollback *
2f10: 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20  /.  u8 *pStmt;  
2f20: 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74     /* Text as it
2f30: 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69   was at the begi
2f40: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
2f50: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
2f60: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
2f70: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
2f80: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
2f90: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
2fa0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
2fb0: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
2fe0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2ff0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  journal */.};../
3000: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
3010: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
3020: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
3030: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
3040: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
3050: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
3060: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
3070: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
3080: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
3090: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
30a0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
30b0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
30c0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
30d0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
30e0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
30f0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
3100: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3110: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
3120: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
3130: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
3140: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3150: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
3160: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
3170: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
3180: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
3190: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
31a0: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
31b0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
31c0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
31d0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
31e0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
31f0: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
3200: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
3210: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
3220: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
3230: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
3240: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3250: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
3260: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
3270: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
3280: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
3290: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
32a0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
32b0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
32c0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
32d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
32e0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
32f0: 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65  e..**.** Pager.e
3300: 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65  rrCode may be se
3310: 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52  t to SQLITE_IOER
3320: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
3330: 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49  T, or.** or SQLI
3340: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
3350: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
3360: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
3370: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
3380: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
3390: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
33a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
33b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
33c0: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
33d0: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
33e0: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
33f0: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
3400: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
3410: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
3420: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
3430: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
3440: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
3450: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
3460: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
3470: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
3480: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
3490: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
34a0: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
34b0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
34c0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
34d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
34e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
34f0: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
3500: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
3510: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
3520: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
3530: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3540: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
3550: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
3560: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
3570: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
3580: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
3590: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
35a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
35b0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
35c0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
35d0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
35e0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
35f0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
3600: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
3630: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
3640: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
3650: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3660: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3670: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3680: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
3690: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
36a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
36b0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
36c0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
36d0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
36e0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
36f0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
3700: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
3710: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
3720: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
3730: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
3760: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
3770: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
3780: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3790: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
37a0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
37b0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
37c0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
37d0: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
37e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
37f0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
3800: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
3810: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
3820: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
3830: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
3840: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
3850: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
3860: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3870: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3880: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3890: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
38a0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
38b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
38c0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
38d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
38e0: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
38f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3900: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
3910: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
3920: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
3930: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
3940: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3950: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
3960: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
3970: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
3980: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
3990: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
39a0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
39b0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
39c0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
39d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
39e0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
39f0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
3a00: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3a10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3a20: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3a30: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3a40: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3a50: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3a70: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3a80: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3a90: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65   cache */.  u8 e
3aa0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3ac0: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
3ad0: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
3ae0: 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e  IVE */.  u8 chan
3af0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20  geCountDone;    
3b00: 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65       /* Set afte
3b10: 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  r incrementing t
3b20: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
3b30: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  r */.  int errCo
3b40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
3b50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
3b60: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
3b70: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
3b80: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3b90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3ba0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3bb0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
3bc0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
3bd0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
3be0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
3bf0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
3c00: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
3c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3c20: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
3c30: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
3c40: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
3c50: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3c70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
3c80: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
3c90: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
3ca0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
3cb0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
3cc0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
3cd0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
3ce0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
3cf0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
3d20: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3d30: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d50: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
3d60: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
3d70: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
3d80: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3da0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
3db0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
3dc0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
3dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3de0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
3df0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
3e00: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
3e30: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
3e40: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3e50: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e70: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3e80: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3e90: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3ea0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3ec0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
3ed0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
3ee0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ase */.  u8 *aIn
3ef0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3f00: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3f10: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3f20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3f30: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
3f40: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3f50: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3f60: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3f80: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3f90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3fa0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3fb0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3fc0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3fe0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
3ff0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4000: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4020: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4030: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4040: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
4050: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
4060: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4070: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4080: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4090: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
40a0: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
40b0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
40c0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
40d0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
40e0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
40f0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4100: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
4110: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
4120: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
4130: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
4140: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
4150: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
4160: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
4170: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
4180: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
4190: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
41a0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
41b0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
41d0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
41e0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4200: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
4210: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
4220: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4230: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4250: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74  List of all dirt
4260: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34  y pages */.  i64
4270: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
4280: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4290: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
42a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
42b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
42c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
42d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
42e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
42f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4300: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
4310: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4320: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
4330: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
4340: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
4350: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
4380: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
4390: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
43a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
43c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
43d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
43e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4400: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
4410: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
4420: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
4430: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
4440: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
4450: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
4460: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
4470: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
4480: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
4490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
44a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
44b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
44c0: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
44d0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
44e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
44f0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
4500: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
4510: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
4520: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f  bPage*,int);   /
4530: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4540: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
4550: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
4560: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4570: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
4580: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
4590: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
45a0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
45b0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
45c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
45d0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
45e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
45f0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
4600: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73  endif.  int nHas
4610: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4620: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
4630: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4640: 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ble */.  PgHdr *
4650: 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  *aHash;         
4660: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
4670: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
4680: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
4690: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
46a0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
46b0: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
46c0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
46d0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79         /* Doubly
46e0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
46f0: 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20  pagers on which 
4700: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65  */.  Pager *pPre
4710: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4720: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   /* sqlite3_rele
4730: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c  ase_memory() wil
4740: 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20  l work */.  int 
4750: 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20  iInUseMM;       
4760: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
4770: 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62  ero if unavailab
4780: 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e  le to MM */.  in
4790: 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20  t iInUseDB;     
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
47b0: 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69  -zero if in sqli
47c0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
47d0: 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ry() */.#endif. 
47e0: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
47f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4800: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
4810: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
4820: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63  r tmp use */.  c
4830: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
4840: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
4850: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
4860: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
4870: 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nges */.};../*.*
4880: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4890: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
48a0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
48b0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
48c0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
48d0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
48e0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
48f0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4900: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4910: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4920: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4940: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4950: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4960: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4970: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4980: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4990: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
49a0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
49b0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
49c0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
49d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
49e0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
49f0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4a00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4a10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4a20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4a30: 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  al */.int sqlite
4a40: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
4a50: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4a60: 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  Number of cache 
4a70: 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23  pages freed */.#
4a80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4a90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4aa0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4ab0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ac0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4ad0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69  ing variable poi
4ae0: 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20  nts to the head 
4af0: 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b  of a double-link
4b00: 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  ed list.** of al
4b10: 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72  l pagers that ar
4b20: 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70  e eligible for p
4b30: 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20  age stealing by 
4b40: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72  the.** sqlite3_r
4b50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
4b60: 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65  interface.  Acce
4b70: 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  ss to this list 
4b80: 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20  is.** protected 
4b90: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55  by the SQLITE_MU
4ba0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20  TEX_STATIC_MEM2 
4bb0: 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66  mutex..*/.#ifdef
4bc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4bd0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
4be0: 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73  .static Pager *s
4bf0: 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
4c00: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  = 0;.#endif.../*
4c10: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4c20: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4c30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4c40: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4c50: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4c60: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4c70: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4c80: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4c90: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4ca0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4cb0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4cc0: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4cd0: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4ce0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4cf0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4d00: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4d10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4d20: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
4d30: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4d40: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4d50: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4d60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4d70: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4d80: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4d90: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4da0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4db0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4dc0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4dd0: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4de0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4df0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4e00: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4e10: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4e20: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4e30: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4e40: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4e50: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4e60: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4e80: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
4e90: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
4ea0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
4eb0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
4ec0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
4ed0: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
4ee0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
4ef0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
4f00: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
4f10: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
4f20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
4f30: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
4f40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
4f50: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
4f60: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
4f70: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
4f80: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
4f90: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
4fa0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
4fb0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
4fc0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
4fd0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
4fe0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
4ff0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5000: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5010: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5020: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
5030: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
5040: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
5050: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
5060: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
5070: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
5080: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
5090: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
50a0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
50b0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
50c0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
50d0: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
50e0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
50f0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5100: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5110: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5120: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
5140: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
5150: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
5160: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
5170: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
5180: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
5190: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
51a0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
51b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
51c0: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
51d0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
51e0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
51f0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5200: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5210: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5220: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5230: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5240: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5250: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
5260: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
5270: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
5280: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
5290: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
52a0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
52b0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
52c0: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
52d0: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
52e0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
52f0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5300: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5310: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5320: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5330: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5340: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5350: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
5360: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
5370: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
5380: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
5390: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
53a0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
53b0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
53c0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
53d0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
53e0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
53f0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5400: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5410: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5420: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5430: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5450: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
5460: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
5470: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
5480: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
5490: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
54a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
54b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
54c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
54d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
54e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
54f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5500: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5510: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5520: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5530: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5540: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5550: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5560: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5570: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5580: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5590: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
55a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
55b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
55c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
55d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
55e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
55f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5600: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5610: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5620: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5630: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5640: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5650: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5660: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5670: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5680: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5690: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
56a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
56b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
56c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
56d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
56e0: 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29 20  he pagerEnter() 
56f0: 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28 29  and pagerLeave()
5700: 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72   routines acquir
5710: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a  e and release.**
5720: 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68   a mutex on each
5730: 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74   pager.  The mut
5740: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ex is recursive.
5750: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
5760: 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65   special-purpose
5770: 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79   mutex.  It only
5780: 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c   provides mutual
5790: 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65   exclusion.** be
57a0: 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65 20  tween the Btree 
57b0: 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d  and the Memory M
57c0: 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65  anagement sqlite
57d0: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
57e0: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  ().** function. 
57f0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65   It does not pre
5800: 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  vent, for exampl
5810: 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66 72  e, two Btrees fr
5820: 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20  om accessing.** 
5830: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
5840: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5850: 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d    Other general-
5860: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20  purpose mutexes 
5870: 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  in.** the btree 
5880: 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61  layer handle tha
5890: 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64  t chore..*/.#ifd
58a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
58b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
58c0: 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  NT.  static void
58d0: 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67 65   pagerEnter(Page
58e0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
58f0: 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66  nUseDB++;.    if
5900: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26  ( p->iInUseMM &&
5910: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20   p->iInUseDB==1 
5920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5930: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5940: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5950: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5960: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5970: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
5980: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5990: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
59a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
59b0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
59c0: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
59d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
59e0: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
59f0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5a00: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
5a10: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
5a20: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
5a30: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5a40: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
5a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
5a60: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
5a70: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
5a80: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
5a90: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
5aa0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
5ab0: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
5ac0: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
5ad0: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
5ae0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
5af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5b00: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
5b10: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
5b20: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
5b30: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
5b40: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
5b50: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
5b60: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
5b70: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
5b80: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
5b90: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
5ba0: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
5bb0: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
5bc0: 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22  %-3d total=%d\n"
5bd0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
5be0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
5bf0: 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e  p), p->nRef, p->
5c00: 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20  pPager->nRef.   
5c10: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
5c20: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
5c30: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
5c40: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
5c50: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
5c60: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
5c70: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
5c80: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
5c90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
5ca0: 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70   true if page *p
5cb0: 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  Pg has already b
5cc0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
5cd0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
5ce0: 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74  journal (or stat
5cf0: 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68  ement snapshot h
5d00: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  as been created,
5d10: 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74   if *pPg is part
5d20: 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d  .** of an in-mem
5d30: 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  ory database)..*
5d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
5d50: 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48  eInStatement(PgH
5d60: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
5d70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
5d80: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d  >pPager;.  if( M
5d90: 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75  EMDB ){.    retu
5da0: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  rn PGHDR_TO_HIST
5db0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69  (pPg, pPager)->i
5dc0: 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nStmt;.  }else{.
5dd0: 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
5de0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75  pPg->pgno;.    u
5df0: 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61  8 *a = pPager->a
5e00: 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75  InStmt;.    retu
5e10: 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67  rn (a && (int)pg
5e20: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
5e30: 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f  Size && (a[pgno/
5e40: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
5e50: 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ))));.  }.}../*.
5e60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
5e70: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
5e80: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e  hash table to N.
5e90: 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f    N must be a po
5ea0: 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a  wer.** of two..*
5eb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
5ec0: 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
5ed0: 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61  table(Pager *pPa
5ee0: 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50  ger, int N){.  P
5ef0: 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70  gHdr **aHash, *p
5f00: 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  Pg;.  assert( N>
5f10: 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d  0 && (N&(N-1))==
5f20: 30 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  0 );.  pagerLeav
5f30: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61 48 61  e(pPager);.  aHa
5f40: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
5f50: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
5f60: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
5f70: 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
5f80: 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d  r);.  if( aHash=
5f90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5fa0: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5fb0: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5fc0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5fd0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5fe0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
5ff0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6000: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
6010: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
6020: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
6030: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
6040: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6050: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6060: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
6070: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
6080: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
6090: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
60a0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
60b0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
60c0: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
60d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
60e0: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
60f0: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
6100: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
6110: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
6120: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
6130: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
6140: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
6150: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
6160: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
6170: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
6180: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6190: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
61a0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
61b0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
61c0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
61d0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
61e0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
61f0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6200: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
6210: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
6220: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
6230: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6240: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
6250: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
6260: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
6270: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
6280: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
6290: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
62a0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
62b0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
62c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
62d0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
62e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
62f0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
6300: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
6310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6320: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
6330: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
6340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6350: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
6360: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
6370: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
6380: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
6390: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
63a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
63b0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
63c0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
63d0: 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72  *)A,B)../*.** Wr
63e0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
63f0: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
6400: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
6410: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
6420: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
6430: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
6440: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
6450: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
6460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6470: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
6480: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
6490: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
64a0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
64b0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
64c0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
64d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
64e0: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
64f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c  .}../*.** If fil
6500: 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63  e pFd is open, c
6510: 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  all sqlite3OsUnl
6520: 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  ock() on it..*/.
6530: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c  static int osUnl
6540: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
6550: 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b   *pFd, int eLock
6560: 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70  ){.  if( !pFd->p
6570: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
6580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
65a0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
65b0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
65c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
65d0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
65e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
65f0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
6600: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
6610: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
6620: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6630: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6640: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6650: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6660: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6670: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6680: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6690: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
66a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
66b0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
66c0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
66d0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
66e0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
66f0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
6700: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
6710: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
6720: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
6730: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6740: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
6750: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
6760: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
6770: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
6780: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6790: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
67a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
67b0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
67c0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
67d0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
67e0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
67f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6800: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
6810: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
6820: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
6830: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b  ager){.  int dc;
6840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
6850: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
6860: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tics */.  int nS
6870: 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53  ector;      /* S
6880: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
6890: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
68a0: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
68b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
68c0: 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
68d0: 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d  d;..  if( fd->pM
68e0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63  ethods ){.    dc
68f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
6900: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
6910: 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  s(fd);.    nSect
6920: 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  or = sqlite3OsSe
6930: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
6940: 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72    nPage = pPager
6950: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
6960: 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45  .  assert(SQLITE
6970: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
6980: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61  ==(512>>8));.  a
6990: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
69a0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
69b0: 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66  5536>>8));..  if
69c0: 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ( !fd->pMethods 
69d0: 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45 5f 49  || (dc&(SQLITE_I
69e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61  OCAP_ATOMIC|(nPa
69f0: 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74 6f 72  ge>>8))&&nSector
6a00: 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  <=nPage) ){.    
6a10: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
6a20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6a30: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
6a40: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
6a50: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
6a60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6a70: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
6a80: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
6a90: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
6aa0: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
6ab0: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
6ac0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
6ad0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
6ae0: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
6af0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
6b00: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
6b10: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
6b20: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
6b30: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
6b40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
6b50: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6b60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6b70: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
6b80: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
6b90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6ba0: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
6bb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
6bc0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
6bd0: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
6be0: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
6bf0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
6c00: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
6c10: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
6c20: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
6c30: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
6c40: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
6c50: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
6c60: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6c70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
6c80: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
6c90: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
6ca0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
6cb0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
6cc0: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
6cd0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
6ce0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
6cf0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
6d00: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
6d10: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
6d20: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
6d30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
6d40: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
6d50: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
6d60: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
6d70: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
6d80: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
6d90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6da0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
6db0: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
6dc0: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
6dd0: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
6de0: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
6df0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
6e00: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
6e10: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
6e20: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
6e30: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
6e40: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
6e50: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
6e60: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
6e70: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
6e80: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
6e90: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
6ea0: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
6eb0: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
6ec0: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
6ed0: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
6ee0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6ef0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
6f00: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
6f10: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
6f20: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
6f30: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
6f40: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
6f50: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
6f60: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
6f70: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
6f80: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
6f90: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 6e 73              (uns
6fb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48  igned char *)PGH
6fc0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65  DR_TO_DATA(pPage
6fd0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
6fe0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
6ff0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
7000: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
7010: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
7020: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
7030: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
7040: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
7050: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
7060: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
7070: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
7080: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
7090: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
70a0: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
70b0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
70c0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
70d0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
70e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
70f0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
7100: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7110: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7120: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
7130: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
7140: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
7150: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
7160: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
7170: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
7180: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
7190: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
71a0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
71b0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
71c0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
71d0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
71e0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
71f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
7200: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
7210: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
7220: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
7230: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
7240: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
7250: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
7260: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
7270: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
7280: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
7290: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
72a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
72b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 2a  ite3_malloc(). *
72c0: 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73  pzMaster is.** s
72d0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  et to point at t
72e0: 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  he memory and SQ
72f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
7300: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
7310: 74 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  t.** sqlite3_fre
7320: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
7330: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
7340: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
7350: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
7360: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
7370: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
7380: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
73a0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
73b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
73c0: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
73d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
73e0: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
73f0: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
7400: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
7410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
7420: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
7430: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
7440: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
7450: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
7460: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7470: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
7480: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
7490: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
74a0: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
74b0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
74c0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
74d0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20  zJ-16, &len);.  
74e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
74f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7500: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7510: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
7520: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
7530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7540: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7550: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7560: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
7570: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
7580: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7590: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
75a0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
75b0: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
75c0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
75d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  char *)sqlite3Ma
75e0: 6c 6c 6f 63 5a 65 72 6f 28 6c 65 6e 2b 31 29 3b  llocZero(len+1);
75f0: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
7600: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
7610: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7620: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
7630: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
7640: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
7650: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
7660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
7680: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
7690: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
76a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
76b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
76c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
76d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
76e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
76f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
7700: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
7710: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
7720: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
7730: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
7740: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
7750: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
7760: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
7770: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
7780: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
7790: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
77a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
77b0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
77c0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
77d0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
77e0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
77f0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
7800: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
7810: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
7820: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7830: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
7840: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
7850: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
7860: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
7870: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
7880: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
7890: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
78a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
78b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
78c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
78d0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
78e0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
78f0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
7900: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
7910: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
7920: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
7930: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
7940: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
7950: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
7960: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
7970: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
7980: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
7990: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
79a0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
79b0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
79e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
79f0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
7a00: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
7a10: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
7a20: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
7a30: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
7a40: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
7a50: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
7a60: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
7a70: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
7a80: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
7a90: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
7aa0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
7ab0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7ac0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
7ad0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
7ae0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
7af0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
7b00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7b10: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
7b20: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
7b30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7b40: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
7b50: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
7b60: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
7b70: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
7b80: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
7b90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7ba0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
7bb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7bc0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7bd0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7be0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7bf0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7c00: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7c10: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7c20: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
7c30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
7c40: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
7c50: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
7c60: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
7c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
7c80: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7c90: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7ca0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7cc0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7cd0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7ce0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7cf0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7d00: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7d10: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7d20: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
7d30: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
7d40: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
7d50: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
7d60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
7d70: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
7d80: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7d90: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7da0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
7db0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7dc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
7dd0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
7de0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
7df0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
7e00: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
7e10: 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48  ager){.  char zH
7e20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7e30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b  urnalMagic)+16];
7e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
7e50: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
7e60: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
7e70: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
7e80: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
7e90: 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73  nalOff;.  }..  s
7ea0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7eb0: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
7ec0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
7ed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7ee0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
7ef0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
7f00: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
7f10: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
7f20: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
7f30: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
7f40: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
7f50: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
7f60: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
7f70: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
7f80: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
7f90: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
7fa0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
7fb0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
7fc0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
7fd0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
7fe0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
7ff0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
8000: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
8010: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8020: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8030: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
8040: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
8050: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
8060: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
8070: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8080: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8090: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
80a0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
80b0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
80c0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
80d0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
80e0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
80f0: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
8100: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
8110: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
8120: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
8130: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8140: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8150: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
8160: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
8170: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
8180: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
8190: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
81a0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
81b0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
81c0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
81d0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
81e0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
81f0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8200: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8210: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8220: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8230: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8240: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
8250: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
8260: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
8270: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
8280: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
8290: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
82a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
82b0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
82c0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
82d0: 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  ,pPager->journal
82e0: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
82f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
8300: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8310: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ger);..  /* The 
8320: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
8330: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
8340: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
8350: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
8360: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
8370: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
8380: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
8390: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
83a0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
83b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54  TE_OK ){.    IOT
83c0: 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20  RACE(("JTAIL %p 
83d0: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
83e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
83f0: 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d  Off-1)).    rc =
8400: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8410: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
8420: 30 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e  00", 1, pPager->
8430: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
8440: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
8450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
8460: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
8470: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
8480: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
8490: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
84a0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
84b0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
84c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
84d0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
84e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
84f0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
8530: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
8590: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
85a0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
85b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
85c0: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
85d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
85e0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
85f0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
8600: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
8610: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
8620: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
8630: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
8640: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
8650: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
8660: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
8670: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
8680: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
8690: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
86a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
86b0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
86c0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
86d0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
86e0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
86f0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
8700: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
8710: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8720: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
8730: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
8740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
8750: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8760: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
8770: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
8780: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
8790: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
87a0: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
87b0: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
87c0: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
87d0: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
87e0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
87f0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
8800: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
8810: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72  ader */.  i64 jr
8820: 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f  nlOff;..  seekJo
8830: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
8840: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8850: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
8860: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
8870: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
8880: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8890: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
88a0: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
88b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
88c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
88d0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
88e0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
88f0: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
8900: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
8910: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
8920: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
8930: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
8940: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
8950: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
8960: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
8970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8980: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
8990: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
89a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
89b0: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
89c0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
89d0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
89e0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
89f0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
8a00: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8a10: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
8a20: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8a30: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
8a40: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
8a50: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
8a60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8a70: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
8a80: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
8a90: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
8aa0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
8ab0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
8ac0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
8ad0: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
8ae0: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
8af0: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
8b00: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
8b10: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
8b20: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
8b30: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
8b40: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
8b50: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
8b60: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
8b70: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
8b80: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
8b90: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
8ba0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
8bb0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
8bc0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
8bd0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8be0: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32  jrnlOff+12, (u32
8bf0: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
8c00: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
8c10: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
8c20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8c30: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
8c40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
8c70: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
8c80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8c90: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
8ca0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
8cb0: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
8cc0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
8cd0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
8ce0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
8cf0: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
8d00: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
8d10: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
8d20: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
8d30: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
8d40: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
8d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
8d60: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
8d70: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
8d80: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
8d90: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
8da0: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
8db0: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
8dc0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
8dd0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
8de0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
8df0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
8e00: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
8e10: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
8e20: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
8e30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
8e40: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
8e50: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
8e60: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
8e70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
8e80: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
8e90: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
8ea0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
8eb0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
8ec0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
8ed0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
8ee0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
8ef0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
8f00: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
8f10: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
8f20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8f30: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
8f40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
8f50: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
8f60: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
8f70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
8f80: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
8f90: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
8fa0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
8fb0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
8fc0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8fd0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
8fe0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
8ff0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
9000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9010: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
9020: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
9030: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
9040: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
9050: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
9060: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
9070: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
9080: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9090: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
90a0: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
90b0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
90c0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
90d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
90e0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
90f0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9100: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9110: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9120: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9130: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9140: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9150: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65  lSync ){.    see
9160: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
9170: 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  er);.  }.  jrnlO
9180: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
9190: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
91a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
91b0: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
91c0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
91d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
91e0: 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
91f0: 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  NO(pPager));.  i
9200: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9210: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9220: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20  jrnlOff += 4;.. 
9230: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9240: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9250: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
9260: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
9270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9280: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e  return rc;.  jrn
9290: 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20  lOff += len;..  
92a0: 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20  put32bits(zBuf, 
92b0: 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74  len);.  put32bit
92c0: 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75  s(&zBuf[4], cksu
92d0: 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  m);.  memcpy(&zB
92e0: 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d  uf[8], aJournalM
92f0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
9300: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
9310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9320: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9330: 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28   zBuf, 8+sizeof(
9340: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20  aJournalMagic), 
9350: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67  jrnlOff);.  pPag
9360: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
9370: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
9380: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9390: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
93a0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
93b0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
93c0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
93d0: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
93e0: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
93f0: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
9400: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
9410: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
9420: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
9430: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
9440: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
9450: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
9460: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
9470: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
9480: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
9490: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
94a0: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
94b0: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
94c0: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
94d0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
94e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
94f0: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
9500: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
9510: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
9520: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
9530: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
9540: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
9550: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
9560: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
9570: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
9580: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
9590: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
95a0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
95b0: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
95c0: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
95d0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
95e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
95f0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
9600: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
9610: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
9620: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
9630: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
9640: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
9650: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
9660: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
9670: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
9680: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
9690: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
96a0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
96b0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
96c0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
96d0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
96e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
96f0: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
9700: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
9710: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
9720: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
9730: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9740: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
9750: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
9760: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
9770: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
9780: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
9790: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
97a0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
97b0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
97c0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
97d0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
97e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
97f0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
9800: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
9810: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
9820: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
9830: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
9840: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9850: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
9860: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  MDB ){.      osU
9870: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
9880: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
9890: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
98a0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
98b0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
98c0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
98d0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
98e0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
98f0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
9900: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
9910: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
9920: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
9930: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
9940: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
9950: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
9960: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
9970: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
9980: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
9990: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
99a0: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
99b0: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
99c0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
99d0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
99e0: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
99f0: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
9a00: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
9a10: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
9a20: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
9a30: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
9a40: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
9a50: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
9a60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
9a70: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
9a80: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
9a90: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
9aa0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
9ab0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
9ac0: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
9ad0: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
9ae0: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
9af0: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
9b00: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
9b10: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
9b20: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
9b30: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
9b40: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
9b50: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
9b60: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
9b70: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
9b80: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
9b90: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
9ba0: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
9bb0: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
9bc0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
9bd0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
9be0: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
9bf0: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
9c00: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
9c10: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
9c20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9c30: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
9c40: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
9c50: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
9c60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
9c70: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
9c80: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
9c90: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
9ca0: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
9cb0: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
9cc0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
9cd0: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
9ce0: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
9cf0: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
9d00: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
9d10: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
9d20: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  All;.    sqlite3
9d30: 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  _free(pPg);.  }.
9d40: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
9d50: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
9d60: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
9d70: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
9d80: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
9d90: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
9da0: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
9db0: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
9dc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
9dd0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
9de0: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
9df0: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
9e00: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
9e10: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
9e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9e30: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
9e40: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74  ransaction.  A t
9e50: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
9e60: 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a  ded by either.**
9e70: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
9e80: 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57  OLLBACK..**.** W
9e90: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
9ea0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
9eb0: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
9ec0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
9ed0: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
9ee0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
9ef0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9f00: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
9f10: 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a  ne will release.
9f20: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
9f30: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
9f40: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
9f50: 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20  in its place if 
9f60: 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61  that is.** the a
9f70: 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67  ppropriate thing
9f80: 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65   to do.  Release
9f90: 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69   locks usually i
9fa0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a  s appropriate,.*
9fb0: 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * unless we are 
9fc0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
9fd0: 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65  ess mode or unle
9fe0: 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a  ss this is a .**
9ff0: 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49   COMMIT AND BEGI
a000: 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e  N or ROLLBACK AN
a010: 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f  D BEGIN operatio
a020: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  n..**.** The jou
a030: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74  rnal file is eit
a040: 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74  her deleted or t
a050: 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  runcated..**.** 
a060: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
a070: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
a080: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
a090: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
a0a0: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
a0b0: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
a0c0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
a0d0: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
a0e0: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
a0f0: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
a100: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
a110: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a120: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
a130: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
a140: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a150: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a160: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
a170: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
a180: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
a190: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
a1a0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
a1b0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
a1c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a1d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
a1e0: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
a1f0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a200: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
a210: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
a220: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
a230: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
a240: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
a250: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
a260: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
a270: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a280: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pen ){.    if( p
a290: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
a2a0: 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20  Mode .          
a2b0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
a2c0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
a2d0: 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c  r->jfd, 0))==SQL
a2e0: 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20  ITE_OK ){;.     
a2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a300: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
a310: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
a320: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
a330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a340: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
a350: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
a360: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
a370: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
a380: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a390: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a3a0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
a3b0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
a3c0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
a3d0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a3e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
a3f0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
a400: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
a410: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
a420: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
a430: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a440: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a450: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
a460: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
a470: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
a480: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
a490: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
a4a0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77  ;.      pPg->alw
a4b0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
a4c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a4d0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
a4e0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a4f0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a500: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a510: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
a520: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
a530: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
a540: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
a550: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
a560: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
a570: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
a580: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
a590: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a5a0: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
a5b0: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
a5c0: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  al==0 );.  }..  
a5d0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a5e0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a5f0: 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b    rc2 = osUnlock
a600: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
a610: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
a620: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
a630: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
a640: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
a650: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
a660: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
a670: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
a680: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
a690: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
a6a0: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
a6b0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
a6c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
a6d0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
a6e0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
a6f0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
a700: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
a710: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
a720: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
a730: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
a740: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
a750: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
a760: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
a770: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
a780: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
a790: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
a7a0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
a7b0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
a7c0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
a7d0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
a7e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
a7f0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
a800: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
a810: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
a820: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
a830: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
a840: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
a850: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
a860: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
a870: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
a880: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
a890: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
a8a0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
a8b0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
a8c0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
a8d0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
a8e0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
a8f0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
a900: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
a910: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
a920: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
a930: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
a940: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
a950: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
a960: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
a970: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
a980: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
a990: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
a9a0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
a9b0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
a9c0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
a9d0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
a9e0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
a9f0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
aa00: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
aa10: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
aa20: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
aa30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
aa40: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
aa50: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
aa60: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
aa70: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
aa80: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
aa90: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
aaa0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
aab0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
aac0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
aad0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
aae0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
aaf0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
ab00: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
ab10: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
ab20: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
ab30: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
ab40: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
ab50: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
ab60: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
ab70: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
ab80: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
ab90: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
aba0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
abb0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
abc0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
abd0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
abe0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
abf0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
ac00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
ac10: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
ac20: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
ac30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
ac40: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
ac50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
ac60: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ac70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ac80: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
ac90: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
aca0: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
acb0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
acc0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
acd0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
ace0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
acf0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
ad00: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
ad10: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
ad20: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
ad30: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
ad40: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
ad50: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
ad60: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
ad70: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
ad80: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
ad90: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
ada0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
adb0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
adc0: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
add0: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
ade0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
adf0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae10: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
ae20: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
ae30: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
ae60: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
ae70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
ae80: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
aea0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
aeb0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
aec0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
aed0: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
aee0: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
aef0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
af00: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
af10: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
af20: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
af30: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
af40: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
af50: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
af60: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
af70: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
af80: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
af90: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
afa0: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
afb0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
afc0: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
afd0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
afe0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
aff0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
b000: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
b010: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
b020: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
b030: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
b040: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
b050: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
b060: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
b070: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
b080: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
b090: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
b0a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
b0b0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
b0c0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
b0d0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
b0e0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
b0f0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
b100: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
b110: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
b120: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
b130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
b140: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
b150: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
b160: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
b170: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
b180: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
b190: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
b1a0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
b1b0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
b1c0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
b1d0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
b1e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
b1f0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
b200: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
b210: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b220: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
b230: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
b240: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
b250: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
b260: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b270: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
b280: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
b290: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
b2a0: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
b2b0: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
b2c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b2d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
b2e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b2f0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
b300: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
b310: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
b320: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b330: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
b340: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
b350: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
b360: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
b370: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
b380: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
b390: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
b3a0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
b3b0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
b3c0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
b3d0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
b3e0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
b3f0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
b400: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
b410: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
b420: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
b430: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b440: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
b450: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
b460: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
b470: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
b480: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
b490: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
b4a0: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
b4b0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
b4c0: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
b4d0: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
b4e0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
b4f0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
b500: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
b510: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
b520: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
b530: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
b540: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
b550: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
b560: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
b570: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
b580: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
b590: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
b5a0: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
b5b0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b5c0: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
b5d0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
b5e0: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
b5f0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
b600: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
b610: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
b620: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
b630: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
b640: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
b650: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
b660: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
b670: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
b680: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
b690: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b6a0: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
b6b0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
b6c0: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
b6d0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b6e0: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
b6f0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
b700: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
b710: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
b720: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
b730: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
b740: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
b750: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
b760: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
b770: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
b780: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
b790: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
b7a0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
b7b0: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
b7c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
b7d0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
b7e0: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
b7f0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
b800: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
b810: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
b820: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
b830: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
b840: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
b850: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
b860: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
b870: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
b880: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
b890: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
b8a0: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
b8b0: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
b8c0: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
b8d0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
b8e0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
b8f0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
b900: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
b910: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
b920: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
b930: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
b940: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
b950: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
b960: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
b970: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
b980: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
b990: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
b9a0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
b9b0: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
b9c0: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
b9d0: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
b9e0: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
b9f0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
ba00: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
ba10: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
ba20: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
ba30: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
ba40: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
ba50: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
ba60: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
ba70: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
ba80: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
ba90: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
baa0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
bab0: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
bac0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
bad0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
bae0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
baf0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
bb00: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
bb10: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
bb20: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
bb30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bb40: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
bb50: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
bb60: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
bb70: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
bb80: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
bb90: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
bba0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
bbb0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
bbc0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
bbd0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
bbe0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
bbf0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
bc00: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
bc10: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
bc20: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
bc30: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
bc40: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
bc50: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
bc60: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
bc70: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
bc80: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
bc90: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
bca0: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
bcb0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
bcc0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
bcd0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
bce0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
bcf0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
bd00: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
bd10: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
bd20: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
bd30: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
bd40: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
bd50: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
bd60: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
bd70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
bd80: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
bd90: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
bda0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
bdb0: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
bdc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
bdd0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
bde0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
bdf0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
be00: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
be10: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
be20: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
be30: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
be40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
be50: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
be60: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
be70: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
be80: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
be90: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
bea0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
beb0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
bec0: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
bed0: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
bee0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
bef0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
bf00: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
bf10: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
bf20: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
bf30: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
bf40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
bf50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bf60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
bf70: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
bf80: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
bf90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
bfa0: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
bfb0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
bfc0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
bfd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bfe0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
bff0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
c000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c010: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
c020: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c030: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c040: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
c050: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
c060: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
c070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c080: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
c090: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
c0a0: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
c0b0: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
c0c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
c0d0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
c0e0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
c0f0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
c100: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
c110: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
c120: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
c130: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
c140: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
c150: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
c160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
c170: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
c180: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c190: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
c1a0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
c1b0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
c1c0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
c1d0: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
c1e0: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
c1f0: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
c200: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
c210: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
c220: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
c230: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
c240: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
c250: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
c260: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
c270: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
c280: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
c290: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c2a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c2b0: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
c2c0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
c2d0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
c2e0: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
c2f0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
c300: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
c310: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
c320: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
c330: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
c340: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
c350: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
c360: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
c370: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
c380: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
c390: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
c3a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
c3b0: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
c3c0: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
c3d0: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
c3e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
c3f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
c400: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
c410: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
c420: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
c430: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
c440: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
c450: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
c460: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
c470: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
c480: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
c490: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
c4a0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
c4b0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
c4c0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
c4d0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
c4e0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
c4f0: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
c500: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c510: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c520: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
c530: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
c540: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
c550: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
c560: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
c570: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
c580: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c590: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
c5a0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
c5b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
c5c0: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
c5d0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
c5e0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
c5f0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
c600: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
c610: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61  lite3_malloc(nMa
c620: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
c630: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
c640: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
c650: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c660: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
c670: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
c680: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
c690: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
c6a0: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
c6b0: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
c6c0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
c6d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c6e0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
c6f0: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
c700: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
c710: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
c720: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
c730: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
c740: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
c750: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
c760: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
c770: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
c780: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
c790: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
c7a0: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
c7b0: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
c7c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
c7d0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
c7e0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
c7f0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
c800: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c810: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
c820: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
c830: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
c840: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c850: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
c860: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
c870: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
c880: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
c890: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
c8a0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
c8b0: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
c8c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
c8d0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
c8e0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
c8f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
c900: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
c920: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
c930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
c940: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
c950: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
c960: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
c970: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
c980: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
c990: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
c9a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
c9c0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c9d0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
c9e0: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
c9f0: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
ca00: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
ca10: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
ca20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
ca30: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
ca40: 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
ca50: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
ca60: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
ca70: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
ca80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ca90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
caa0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
cab0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cac0: 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
cad0: 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a  al += (strlen(zJ
cae0: 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
caf0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
cb00: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
cb10: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
cb20: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
cb30: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
cb40: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
cb50: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
cb60: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
cb70: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
cb80: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
cb90: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
cba0: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
cbb0: 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
cbc0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cbd0: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  ...static void p
cbe0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
cbf0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
cc00: 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  r);../*.** Trunc
cc10: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
cc20: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
cc30: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
cc40: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
cc50: 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74  ndicated. Also t
cc60: 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
cc70: 65 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ed representatio
cc80: 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a  n of the file..*
cc90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
cca0: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
ccb0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
ccc0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
ccd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cce0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
ccf0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
cd00: 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  E && pPager->fd-
cd10: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
cd20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
cd30: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
cd40: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
cd50: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
cd60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
cd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cd80: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
cd90: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
cda0: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
cdb0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
cdc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cdd0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
cde0: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
cdf0: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
ce00: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
ce10: 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72  ze is the larger
ce20: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   of the sector s
ce30: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
ce40: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
ce50: 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65  orSize() and the
ce60: 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74   pageSize..*/.st
ce70: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
ce80: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
ce90: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
cea0: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
ceb0: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
cec0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
ced0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
cee0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
cef0: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
cf00: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
cf10: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
cf20: 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
cf30: 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
cf40: 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
cf50: 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
cf60: 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
cf70: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
cf80: 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
cf90: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
cfa0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
cfb0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
cfc0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
cfd0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
cfe0: 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72  ectorSize<pPager
cff0: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
d000: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
d010: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
d020: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
d030: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
d040: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
d050: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
d060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
d070: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
d080: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
d090: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
d0a0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
d0b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d0c0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
d0d0: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
d0e0: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
d0f0: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
d100: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
d110: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
d120: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
d130: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d140: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
d150: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
d160: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
d170: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
d180: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
d190: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
d1a0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
d1b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
d1c0: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
d1d0: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
d1e0: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
d1f0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
d200: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
d210: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
d220: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
d230: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
d240: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
d250: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
d260: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
d270: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
d280: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
d290: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
d2a0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
d2b0: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
d2c0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
d2d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
d2e0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
d2f0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
d300: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
d310: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
d320: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
d330: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
d340: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
d350: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
d360: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
d370: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
d380: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
d390: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
d3a0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
d3b0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
d3c0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
d3d0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
d3e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
d3f0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
d400: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
d410: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
d420: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
d430: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
d440: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
d450: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
d460: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
d470: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
d480: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
d490: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
d4a0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
d4b0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
d4c0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
d4d0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
d4e0: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
d4f0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
d500: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
d510: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
d520: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
d530: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
d540: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
d550: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
d560: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
d570: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
d580: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
d590: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
d5a0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
d5b0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
d5c0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
d5d0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
d5e0: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
d5f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
d600: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
d610: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
d620: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
d630: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
d640: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
d650: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
d660: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
d670: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
d680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
d690: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
d6a0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
d6b0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
d6c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
d6d0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
d6e0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
d6f0: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
d700: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
d710: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
d720: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
d730: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
d740: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
d750: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
d760: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
d770: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
d780: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
d790: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
d7a0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
d7b0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
d7c0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
d7d0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
d7e0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
d7f0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
d800: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
d810: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
d820: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
d830: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
d840: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
d850: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
d860: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
d870: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
d880: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
d890: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
d8a0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
d8b0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
d8c0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
d8d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
d8e0: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
d8f0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
d900: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
d910: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
d920: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
d930: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
d940: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d950: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
d960: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
d970: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
d980: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
d990: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
d9a0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
d9b0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
d9c0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
d9d0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
d9e0: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
d9f0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
da00: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
da10: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
da20: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
da30: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
da40: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
da50: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
da60: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
da70: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
da80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
da90: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
daa0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
dab0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
dac0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
dad0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
dae0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
daf0: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
db00: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
db10: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
db20: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
db30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
db40: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
db50: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
db60: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db80: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
db90: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
dba0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbc0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
dbd0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
dbe0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
dbf0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
dc00: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
dc10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
dc40: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
dc50: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
dc60: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
dc70: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
dc80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
dc90: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
dca0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
dcb0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
dcc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
dcd0: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
dce0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
dcf0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
dd00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
dd10: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
dd20: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
dd30: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
dd40: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
dd50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
dd60: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
dd70: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
dd80: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
dd90: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
dda0: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
ddb0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
ddc0: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
ddd0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
dde0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
ddf0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
de00: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
de10: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
de20: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
de30: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
de40: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
de50: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
de60: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
de70: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
de80: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
de90: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
dea0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
deb0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
dec0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ded0: 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d  TE_OK .   || (zM
dee0: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
def0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
df00: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
df10: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29 20  ACCESS_EXISTS)) 
df20: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
df30: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
df40: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
df50: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
df60: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
df70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
df80: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
df90: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
dfa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
dfb0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
dfc0: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
dfd0: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
dfe0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
dff0: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
e000: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
e010: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e020: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
e030: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
e040: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
e050: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
e060: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
e070: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
e080: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
e090: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
e0a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e0b0: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
e0c0: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
e0d0: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
e0e0: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
e0f0: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
e100: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
e110: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
e120: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
e130: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
e140: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
e150: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
e160: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
e170: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
e180: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
e190: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
e1a0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
e1b0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
e1c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e1d0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
e1e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
e1f0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
e200: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
e210: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
e220: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
e230: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
e240: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
e250: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
e260: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
e270: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
e280: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
e290: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
e2a0: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
e2b0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
e2c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
e2d0: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
e2e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
e2f0: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
e300: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
e310: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
e320: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
e330: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
e340: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
e350: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
e360: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
e370: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
e380: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e390: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
e3a0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
e3b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
e3c0: 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
e3d0: 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
e3e0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
e3f0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
e400: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
e410: 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
e420: 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
e430: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
e440: 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
e450: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
e480: 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
e490: 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
e4a0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
e4b0: 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
e4c0: 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
e4d0: 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
e4e0: 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
e4f0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
e500: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
e510: 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
e520: 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
e530: 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
e540: 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
e550: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
e560: 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
e570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
e580: 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
e590: 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
e5a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
e5b0: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
e5c0: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
e5d0: 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
e5e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
e5f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
e600: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
e610: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
e620: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e630: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
e640: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
e650: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
e660: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
e670: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e680: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e690: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
e6a0: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
e6b0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
e6c0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
e6d0: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
e6e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e6f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
e700: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
e710: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e720: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
e730: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
e740: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
e750: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
e760: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
e770: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e780: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
e790: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
e7a0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
e7b0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
e7c0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
e7d0: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
e7e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e7f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
e800: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e810: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
e820: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e830: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
e840: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
e850: 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
e860: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
e870: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
e880: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
e890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e8a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
e8b0: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
e8c0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
e8d0: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
e8e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e8f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
e900: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
e910: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
e920: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
e930: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
e940: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
e950: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
e960: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
e970: 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
e980: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
e990: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
e9a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
e9b0: 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
e9c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e9d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
e9e0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
e9f0: 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
ea00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ea10: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
ea20: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
ea30: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
ea40: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
ea50: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
ea60: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
ea70: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
ea80: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
ea90: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
eaa0: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
eab0: 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
eac0: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
ead0: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
eae0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
eaf0: 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
eb00: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
eb10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
eb20: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
eb30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
eb40: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
eb50: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
eb60: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
eb70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
eb80: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
eb90: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
eba0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
ebb0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
ebc0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
ebd0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
ebe0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
ebf0: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
ec00: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
ec10: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
ec20: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
ec30: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
ec40: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
ec50: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
ec60: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
ec70: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
ec80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
ec90: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
eca0: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
ecb0: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
ecc0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
ecd0: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
ece0: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
ecf0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
ed00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ed10: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
ed20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
ed30: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ed50: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
ed60: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
ed70: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
ed80: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
ed90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
eda0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
edb0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
edc0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
edd0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ede0: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
edf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
ee00: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
ee10: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
ee20: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
ee30: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ee40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
ee50: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
ee60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ee70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
ee80: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
ee90: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
eea0: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
eeb0: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
eec0: 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
eed0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
eee0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
eef0: 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
ef00: 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
ef10: 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
ef20: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
ef30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
ef40: 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
ef50: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
ef60: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
ef70: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
ef80: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
ef90: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
efa0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
efb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
efc0: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
efd0: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
efe0: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
eff0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
f000: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
f010: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
f020: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
f030: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
f040: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
f050: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
f060: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
f070: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
f080: 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
f090: 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
f0a0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
f0b0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
f0c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
f0d0: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
f0e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
f0f0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
f100: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
f110: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
f120: 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
f130: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
f140: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
f150: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
f160: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
f170: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
f180: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
f190: 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
f1a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
f1b0: 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
f1c0: 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
f1d0: 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
f1e0: 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
f1f0: 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
f200: 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
f210: 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
f220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
f230: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
f240: 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
f250: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f260: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
f270: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
f280: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
f290: 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
f2a0: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
f2b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f2c0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
f2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f2e0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
f2f0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
f300: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
f310: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
f320: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
f330: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
f340: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
f350: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
f360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
f370: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
f380: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
f390: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
f3a0: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
f3b0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
f3c0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
f3d0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f3e0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
f3f0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
f400: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
f410: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
f420: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
f430: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
f440: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
f450: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
f460: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
f470: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
f480: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f490: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
f4a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f4b0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
f4c0: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
f4d0: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
f4e0: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
f4f0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
f500: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
f510: 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
f520: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
f530: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
f540: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
f550: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f560: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
f570: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f580: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
f590: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f5a0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
f5b0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
f5c0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
f5d0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
f5e0: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
f5f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f600: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
f610: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
f620: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
f630: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
f640: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
f650: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
f660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f670: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f680: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f690: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
f6a0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
f6b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
f6c0: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
f6d0: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
f6e0: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
f6f0: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
f700: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
f710: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
f720: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
f730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f740: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
f750: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
f760: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
f770: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
f780: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
f790: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
f7a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
f7b0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
f7c0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f7d0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
f7e0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
f7f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
f800: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f810: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
f820: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
f830: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f840: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
f850: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
f860: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
f870: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
f880: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
f890: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f8a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
f8b0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
f8c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
f8d0: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
f8e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f8f0: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
f900: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
f910: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
f920: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
f930: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
f940: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
f950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
f960: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
f970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
f980: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
f990: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
f9a0: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
f9b0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
f9c0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
f9d0: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
f9e0: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
f9f0: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
fa00: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
fa10: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
fa20: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
fa30: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
fa40: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
fa50: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
fa60: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
fa70: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
fa80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fa90: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
faa0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
fab0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
fac0: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
fad0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
fae0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
faf0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
fb10: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
fb20: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
fb30: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
fb40: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
fb50: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
fb60: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
fb70: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
fb80: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
fb90: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
fba0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
fbb0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
fbc0: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
fbd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
fbe0: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
fbf0: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
fc00: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
fc10: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
fc20: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
fc30: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
fc40: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
fc50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
fc60: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
fc70: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
fc80: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
fc90: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
fca0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
fcb0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
fcc0: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
fcd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fce0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcf0: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
fd00: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
fd10: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
fd20: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
fd30: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
fd40: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
fd50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
fd60: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
fd70: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
fd80: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
fd90: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
fda0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
fdb0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
fdc0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
fdd0: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
fdf0: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
fe00: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
fe10: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
fe20: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
fe30: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
fe40: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
fe50: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
fe60: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
fe70: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
fe80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe90: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
fea0: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
feb0: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
fec0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
fed0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
fee0: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
fef0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
ff00: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
ff10: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
ff20: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ff30: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
ff40: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
ff50: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
ff60: 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
ff70: 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
ff80: 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
ff90: 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
ffa0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
ffb0: 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
ffc0: 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
ffd0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
ffe0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
fff0: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
10000 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
10010 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
10020 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
10030 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
10040 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
10050 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
10060 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
10070 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
10080 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
10090 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
100a0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
100b0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
100c0 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
100d0 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
100e0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
100f0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
10100 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
10110 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
10120 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
10130 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
10140 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
10150 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
10160 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
10170 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
10180 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
10190 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4e 61  ed..**.** If zNa
101a0 6d 65 4f 75 74 20 69 73 20 30 2c 20 74 68 65 6e  meOut is 0, then
101b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
101c0 4a 4f 55 52 4e 41 4c 20 69 73 20 70 61 73 73 65  JOURNAL is passe
101d0 64 20 74 6f 20 74 68 65 20 4f 53 20 6c 61 79 65  d to the OS laye
101e0 72 2e 0a 2a 2a 20 49 66 20 7a 4e 61 6d 65 4f 75  r..** If zNameOu
101f0 74 20 69 73 20 6e 6f 74 20 30 2c 20 53 51 4c 49  t is not 0, SQLI
10200 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
10210 69 73 20 70 61 73 73 65 64 2e 0a 2a 2f 0a 73 74  is passed..*/.st
10220 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
10230 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
10240 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10250 66 73 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  fs, .  sqlite3_f
10260 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63  ile *pFile, .  c
10270 68 61 72 20 2a 7a 4e 61 6d 65 4f 75 74 0a 29 7b  har *zNameOut.){
10280 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
10290 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
102a0 66 6c 61 67 73 20 3d 20 28 0a 20 20 20 20 20 53  flags = (.     S
102b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
102c0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
102d0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 53 51  _CREATE|.     SQ
102e0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
102f0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
10300 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 20 20  DELETEONCLOSE.  
10310 29 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 46 72 65  );..  char *zFre
10320 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4e 61  e = 0;.  if( zNa
10330 6d 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  meOut==0 ){.    
10340 7a 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  zFree = (char *)
10350 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
10360 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
10370 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 72 65 65  ;.    if( !zFree
10380 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10390 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
103a0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 4f 75     }.    zNameOu
103b0 74 20 3d 20 7a 46 72 65 65 3b 0a 20 20 20 20 66  t = zFree;.    f
103c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
103d0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 3b 0a  PEN_SUBJOURNAL;.
103e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
103f0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
10400 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 0a  N_TEMP_DB;.  }..
10410 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10420 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
10430 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
10440 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
10450 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
10460 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
10470 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
10480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 47  ;.    sqlite3OsG
10490 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66 73 2c  etTempName(pVfs,
104a0 20 7a 4e 61 6d 65 4f 75 74 29 3b 0a 20 20 20 20   zNameOut);.    
104b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
104c0 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 4f 75  en(pVfs, zNameOu
104d0 74 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c  t, pFile, flags,
104e0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
104f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
10500 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  | pFile->pMethod
10510 73 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63  s );.  }while( c
10520 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
10530 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
10540 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
10550 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 72  sqlite3_free(zFr
10560 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ee);.  return rc
10570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
10580 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
10590 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
105a0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
105b0 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
105c0 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
105d0 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
105e0 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
105f0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
10600 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
10610 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
10620 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
10630 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
10640 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
10650 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
10660 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
10670 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
10680 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
10690 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
106a0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
106b0 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
106c0 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
106d0 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
106e0 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
106f0 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
10700 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
10710 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
10720 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
10730 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
10740 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
10750 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
10760 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
10770 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
10780 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
10790 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
107a0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
107b0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
107c0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
107d0 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
107e0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
107f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10800 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
10810 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
10820 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
10830 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
10840 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
10850 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
10860 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
10870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
10880 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
10890 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
108a0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
108b0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
108d0 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
108e0 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
108f0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
10900 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
10910 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
10920 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
10930 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
10940 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
10950 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
10960 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
10970 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
10980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10990 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
109a0 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
109b0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
109c0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
109d0 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
109e0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
109f0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
10a00 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
10a10 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
10a20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
10a30 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a  OCK)!=0;.  int j
10a40 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
10a50 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
10a60 69 7a 65 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a  ize(pVfs);..  /*
10a70 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74   The default ret
10a80 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  urn is a NULL po
10a90 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61  inter */.  *ppPa
10aa0 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41  ger = 0;..  /* A
10ab0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
10ac0 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
10ad0 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
10ae0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
10af0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
10b00 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
10b10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
10b20 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10b30 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
10b40 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e +           /*
10b50 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
10b60 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a  e structure */ .
10b70 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
10b80 6c 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  le * 2 +        
10b90 2f 2a 20 54 68 65 20 64 62 20 61 6e 64 20 73 74  /* The db and st
10ba0 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  mt journal files
10bb0 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 6d   */ .    pVfs->m
10bc0 78 50 61 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20  xPathname * 3 + 
10bd0 33 30 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  30   /* zFilenam
10be0 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  e, zDirectory, z
10bf0 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
10c00 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b    if( !pPager ){
10c10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10c20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10c30 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
10c40 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
10c50 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
10c60 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
10c70 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
10c80 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
10c90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10ca0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
10cb0 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
10cc0 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
10cd0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
10ce0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
10cf0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
10d00 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
10d10 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
10d20 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
10d30 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
10d40 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
10d50 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10d60 5b 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  [pVfs->mxPathnam
10d70 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  e];.  pPager->zJ
10d80 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
10d90 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 70 56 66  ->zDirectory[pVf
10da0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a  s->mxPathname];.
10db0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
10dc0 20 70 56 66 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65   pVfs;..  /* Ope
10dd0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
10de0 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61   and set zFullPa
10df0 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20  thname to point 
10e00 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20  at malloc()ed . 
10e10 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61   ** memory conta
10e20 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65  ining the comple
10e30 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65  te filename (i.e
10e40 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  . including the 
10e50 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f  directory)..  */
10e60 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
10e70 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
10e80 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
10e90 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10ea0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
10eb0 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
10ec0 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
10ed0 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
10ee0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
10ef0 6e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  name[0] = '\0';.
10f00 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
10f10 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
10f20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
10f30 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
10f40 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
10f50 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
10f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10f80 69 66 28 20 73 74 72 6c 65 6e 28 70 50 61 67 65  if( strlen(pPage
10f90 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3e 28 70  r->zFilename)>(p
10fa0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
10fb0 2d 20 73 74 72 6c 65 6e 28 22 2d 6a 6f 75 72 6e  - strlen("-journ
10fc0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 20  al")) ){.       
10fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10fe0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ANTOPEN;.       
10ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11000 20 20 69 6e 74 20 6f 66 6c 61 67 20 3d 20 0a 20    int oflag = . 
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
11020 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11030 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
11040 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
11050 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 20  EN_MAIN_DB);.   
11060 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
11070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
11080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
11090 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
110a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
110b0 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c 20 26 66  r->fd, oflag, &f
110c0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
110d0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
110e0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
110f0 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20  DONLY);.        
11100 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11120 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
11130 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
11140 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
11150 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
11160 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
11170 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
11180 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
11190 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
111a0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
111b0 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
111c0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
111d0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
111e0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
111f0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
11200 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11210 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
11220 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
11230 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
11240 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
11250 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
11260 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
11270 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 44 45 46  alloc(SQLITE_DEF
11280 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
11290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
112a0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
112b0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
112c0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
112d0 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
112e0 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
112f0 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
11300 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
11310 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
11320 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
11330 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
11340 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
11350 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
11360 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
11370 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
11380 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
11390 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
113a0 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  er || !pPager->p
113b0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
113c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
113d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
113e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
113f0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
11400 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
11410 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
11420 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
11430 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
11440 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
11450 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
11460 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
11470 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
11480 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
11490 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  er, zFullPathnam
114a0 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
114b0 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
114c0 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
114d0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
114e0 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
114f0 6c 65 6e 61 6d 65 2c 20 70 56 66 73 2d 3e 6d 78  lename, pVfs->mx
11500 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Pathname);.  for
11510 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72  (i=strlen(pPager
11520 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69  ->zDirectory); i
11530 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
11540 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
11550 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
11560 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
11570 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
11580 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
11590 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
115a0 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
115b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
115c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
115d0 6d 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  me, pVfs->mxPath
115e0 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
115f0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
11600 6c 5b 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d  l[strlen(pPager-
11610 3e 7a 4a 6f 75 72 6e 61 6c 29 5d 2c 20 22 2d 6a  >zJournal)], "-j
11620 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20  ournal", 9);..  
11630 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
11640 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
11650 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
11660 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
11670 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
11680 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
11690 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
116a0 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
116b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
116c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
116d0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
116e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
116f0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
11700 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
11710 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
11720 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11730 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
11740 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
11750 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
11760 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
11770 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
11780 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
11790 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
117a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
117b0 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
117c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
117d0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
117e0 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28  COUNT;.  assert(
117f0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
11800 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
11810 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
11820 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
11830 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
11840 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11850 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
11860 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
11870 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
11880 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
11890 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
118a0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
118b0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
118c0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
118d0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
118e0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
118f0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
11900 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
11910 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
11920 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
11930 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
11940 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
11950 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
11960 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
11970 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
11980 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
11990 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
119a0 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
119b0 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
119c0 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
119d0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
119e0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
119f0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20  NC_NORMAL;.  /* 
11a00 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11a10 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11a20 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11a30 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
11a40 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
11a50 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
11a60 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
11a70 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
11a80 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
11a90 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d  >fd->pMethods||m
11aa0 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b  emDb||tempFile);
11ab0 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
11ac0 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69  .    setSectorSi
11ad0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
11ae0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
11af0 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
11b00 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
11b10 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
11b20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
11b30 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
11b40 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
11b50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11b60 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
11b70 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d  GEMENT.  pPager-
11b80 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
11b90 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44   pPager->iInUseD
11ba0 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65  B = 0;.  if( !me
11bb0 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
11bc0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20  e3_mutex *mutex 
11bd0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
11be0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
11bf0 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
11c00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
11c10 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
11c20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  .    pPager->pNe
11c30 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  xt = sqlite3Page
11c40 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  rList;.    if( s
11c50 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
11c60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
11c80 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20  t->pPrev==0 );. 
11c90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
11ca0 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  rList->pPrev = p
11cb0 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Pager;.    }.   
11cc0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d   pPager->pPrev =
11cd0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
11ce0 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
11cf0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  r;.    sqlite3_m
11d00 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
11d10 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
11d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11d40 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
11d50 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
11d60 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
11d70 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
11d80 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
11d90 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
11da0 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
11db0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
11dc0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
11dd0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11de0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
11df0 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
11e00 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
11e10 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
11e20 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
11e30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
11e40 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
11e50 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
11e60 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
11e70 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
11e80 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
11e90 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
11ea0 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
11eb0 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
11ec0 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
11ed0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
11ee0 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
11ef0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
11f00 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
11f10 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
11f20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
11f30 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
11f40 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11f50 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
11f60 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
11f70 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
11f80 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
11f90 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
11fa0 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
11fb0 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
11fc0 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
11fd0 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
11fe0 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
11ff0 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
12000 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
12010 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
12020 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
12030 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
12040 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
12050 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
12060 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
12070 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
12080 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
12090 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
120a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
120b0 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
120c0 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
120d0 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
120e0 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
120f0 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
12100 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
12110 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
12120 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
12130 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
12140 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
12150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12160 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
12170 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
12180 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
12190 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
121a0 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
121b0 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
121c0 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
121d0 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
121e0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
121f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12200 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
12210 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12220 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
12230 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
12240 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
12250 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
12260 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
12270 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
12280 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
12290 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 45  =0 ){.    pagerE
122a0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
122b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
122c0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
122d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
122e0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65  geSize;.    page
122f0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
12300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12310 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
12320 63 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ce);.    pPager-
12330 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
12340 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
12350 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
12360 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
12370 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Size;.}../*.** A
12380 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
12390 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
123a0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
123b0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
123c0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
123d0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
123e0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
123f0 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
12400 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
12410 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
12420 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
12430 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
12440 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
12450 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
12460 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
12470 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
12480 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
12490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
124a0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
124b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
124c0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
124d0 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
124e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
124f0 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
12500 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12510 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
12520 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
12530 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
12540 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
12550 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
12560 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
12570 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
12580 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
12590 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
125a0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
125b0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
125c0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
125d0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
125e0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
125f0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
12600 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
12610 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
12620 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
12630 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
12640 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
12650 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
12660 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
12670 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12680 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
12690 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
126a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
126b0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
126c0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
126d0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
126e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
126f0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
12700 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
12710 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
12720 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
12730 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
12740 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
12750 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
12760 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
12770 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
12780 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
12790 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
127a0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
127b0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
127c0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
127d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
127e0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
127f0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
12800 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
12810 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
12820 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
12830 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
12840 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
12850 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
12860 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
12870 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
12880 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
12890 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
128a0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
128b0 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
128c0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
128d0 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
128e0 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
128f0 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
12900 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
12910 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
12920 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
12930 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
12940 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
12950 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
12960 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
12970 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
12980 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
12990 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
129a0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
129b0 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
129c0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
129d0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
129e0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
129f0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
12a00 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
12a10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
12a30 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
12a40 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c    assert(MEMDB||
12a50 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
12a60 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
12a70 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  mpFile);.  if( p
12a80 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
12a90 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ods ){.    IOTRA
12aa0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
12ab0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
12ac0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
12ad0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
12ae0 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
12af0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
12b00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
12b10 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
12b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12b50 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
12b60 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
12b70 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
12b80 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
12b90 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
12ba0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
12bb0 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
12bc0 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
12bd0 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
12be0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
12bf0 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
12c00 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
12c10 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
12c20 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
12c30 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
12c40 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
12c50 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
12c60 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
12c70 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
12c80 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
12c90 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
12ca0 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
12cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12cc0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
12cd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
12ce0 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   n = 0;.  int rc
12cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12d00 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
12d10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
12d30 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
12d40 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
12d50 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
12d60 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
12d70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
12d80 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
12d90 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
12da0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
12db0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
12dc0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
12dd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12de0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
12df0 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
12e00 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
12e10 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
12e20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12e30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
12e40 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
12e50 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12e60 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
12e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
12e80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
12e90 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
12ea0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
12eb0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
12ec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
12ed0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
12ee0 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
12ef0 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
12f00 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
12f10 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
12f20 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
12f30 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
12f40 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
12f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
12f60 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
12f70 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12f80 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
12f90 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
12fa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
12fb0 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
12fc0 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
12fd0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
12fe0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
12ff0 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
13000 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
13010 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
13020 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
13030 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
13040 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
13050 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
13060 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
13070 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
13080 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
13090 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
130a0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
130b0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
130c0 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
130d0 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
130e0 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
130f0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
13100 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
13110 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
13120 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
13130 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
13140 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
13150 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
13160 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
13170 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
13180 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
13190 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
131a0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
131b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
131c0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
131d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
131e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
131f0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
13200 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13210 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
13220 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
13230 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
13240 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
13250 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
13260 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
13270 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
13280 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
13290 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
132a0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
132b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
132c0 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
132d0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
132e0 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
132f0 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
13300 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
13310 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
13320 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
13330 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
13340 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
13350 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
13360 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
13370 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
13380 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
13390 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
133a0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
133b0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
133c0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
133d0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
133e0 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
133f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
13400 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
13410 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
13420 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
13430 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
13440 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
13450 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
13460 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
13470 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
13480 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
13490 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
134a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
134b0 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65  ;..  /* Keep the
134c0 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f   pFirstSynced po
134d0 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61  inter pointing a
134e0 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63  t the first sync
134f0 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f  hronized page */
13500 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67  .  if( pPg==pPag
13510 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
13520 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13530 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
13540 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  e;.    while( p 
13550 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
13560 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
13570 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72  ee; }.    pPager
13580 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
13590 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   p;.  }..  /* Un
135a0 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72  link from the fr
135b0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20  eelist */.  if( 
135c0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
135d0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
135e0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
135f0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
13600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
13610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
13620 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  First==pPg );.  
13630 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
13640 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
13650 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  e;.  }.  if( pPg
13660 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
13670 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
13680 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
13690 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
136a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
136b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  rt( pPager->pLas
136c0 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
136d0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
136e0 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
136f0 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  }.  pPg->pNextFr
13700 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
13710 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55  ree = 0;..  /* U
13720 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
13730 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
13740 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
13750 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
13760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13770 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13780 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
13790 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
137a0 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
137b0 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
137c0 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
137d0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
137e0 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
137f0 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
13800 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
13810 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
13820 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
13830 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
13840 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
13850 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
13860 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
13870 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
13880 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
13890 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
138a0 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
138b0 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
138c0 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
138d0 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
138e0 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
138f0 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
13900 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
13910 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
13920 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
13930 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
13940 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
13950 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
13960 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
13970 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
13980 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
13990 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
139a0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
139b0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
139c0 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
139d0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
139e0 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
139f0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
13a00 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
13a10 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
13a20 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
13a30 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
13a40 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
13a50 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
13a60 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
13a70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
13a80 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
13a90 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
13aa0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
13ab0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
13ac0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
13ad0 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
13ae0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
13af0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
13b00 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
13b10 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
13b20 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
13b30 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
13b40 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
13b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13b60 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
13b70 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
13b80 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
13b90 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
13ba0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
13bb0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
13bc0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
13bd0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
13be0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
13bf0 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
13c00 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
13c10 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
13c20 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
13c30 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
13c40 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
13c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13c60 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
13c70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
13c80 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
13c90 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
13ca0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13cb0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
13cc0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13cd0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
13ce0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
13cf0 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
13d00 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
13d10 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
13d20 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
13d30 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
13d40 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
13d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
13d60 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
13d70 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
13d80 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
13d90 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
13da0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
13db0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
13dc0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
13dd0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
13de0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
13df0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
13e00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
13e10 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
13e20 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
13e30 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
13e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
13e50 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
13e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
13e80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
13e90 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
13ea0 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
13eb0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
13ec0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
13ed0 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
13ee0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
13ef0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
13f00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
13f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13f20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13f30 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
13f40 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
13f50 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
13f60 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
13f70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13f80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
13f90 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
13fa0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
13fb0 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
13fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13fd0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
13fe0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13ff0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
14000 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
14010 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
14020 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
14030 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
14040 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
14050 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
14060 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
14070 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
14080 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
14090 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
140a0 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
140b0 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
140c0 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
140d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
140e0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
140f0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
14100 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
14110 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
14120 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
14130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14140 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  K;.  }.  pagerEn
14150 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
14160 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
14170 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
14180 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
14190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
141a0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
141b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
141c0 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
141d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
141e0 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
141f0 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67  cating. */.  pag
14200 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
14210 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
14220 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
14230 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
14240 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  K);.  pagerLeave
14250 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
14260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14270 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14280 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
14290 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
142a0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
142b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
142c0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
142d0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
142e0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
142f0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
14300 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
14310 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
14320 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
14330 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14340 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
14350 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
14360 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
14370 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
14380 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
14390 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
143a0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
143b0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
143c0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
143d0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
143e0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
143f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
14400 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
14410 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
14420 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
14430 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14440 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
14450 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
14460 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
14470 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
14480 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
14490 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
144a0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
144b0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
144c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
144d0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
144e0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
144f0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
14500 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
14510 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
14520 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
14530 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
14540 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14550 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
14560 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44  MENT.  if( !MEMD
14570 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
14580 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
14590 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
145a0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
145b0 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
145c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
145d0 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
145e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
145f0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50  Prev ){.      pP
14600 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  ager->pPrev->pNe
14610 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
14620 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
14630 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14640 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e  rList = pPager->
14650 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
14660 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65   if( pPager->pNe
14670 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  xt ){.      pPag
14680 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  er->pNext->pPrev
14690 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76   = pPager->pPrev
146a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
146b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
146c0 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
146d0 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
146e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
146f0 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
14700 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
14710 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14720 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
14730 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
14740 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
14750 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
14760 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
14770 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
14780 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
14790 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
147a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
147b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
147c0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
147d0 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
147e0 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
147f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14800 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
14810 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
14820 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14830 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
14840 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
14850 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
14860 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
14870 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
14880 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
14890 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
148a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
148b0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
148c0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
148d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
148e0 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
148f0 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
14900 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
14910 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
14920 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
14930 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
14940 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14950 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
14960 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
14970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
14980 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
14990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
149a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
149b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
149c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
149d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
149e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
149f0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
14a00 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
14a10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
14a20 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
14a30 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
14a40 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
14a50 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
14a60 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
14a70 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
14a80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
14a90 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
14aa0 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
14ab0 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
14ac0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
14ad0 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
14ae0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
14af0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
14b00 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
14b10 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
14b20 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
14b30 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
14b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
14b50 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
14b60 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
14b70 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
14b80 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
14b90 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
14ba0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
14bb0 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
14bc0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
14bd0 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
14be0 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
14bf0 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
14c00 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
14c10 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
14c20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
14c30 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
14c40 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
14c50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
14c60 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
14c70 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
14c80 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
14c90 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
14ca0 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
14cb0 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
14cc0 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
14cd0 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
14ce0 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
14cf0 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
14d00 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
14d10 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
14d20 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
14d30 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
14d40 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
14d50 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
14d60 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
14d70 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
14d80 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
14d90 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
14da0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
14db0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
14dc0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
14dd0 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
14de0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
14df0 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
14e00 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
14e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
14e30 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
14e40 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
14e50 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
14e60 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
14e70 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
14e80 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
14e90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
14ea0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
14eb0 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
14ec0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
14ed0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
14ee0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
14ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f00 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
14f10 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
14f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
14f30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
14f40 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
14f50 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
14f60 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
14f70 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
14f80 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
14f90 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
14fa0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
14fb0 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
14fc0 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
14fd0 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
14fe0 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
14ff0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
15000 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
15010 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
15020 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  er);.  page_ref(
15030 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  pPg);.  pagerLea
15040 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  ve(pPg->pPager);
15050 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15060 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
15070 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
15080 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
15090 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
150a0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
150b0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
150c0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
150d0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
150e0 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
150f0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
15100 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
15110 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
15120 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
15130 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
15140 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
15150 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
15160 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
15170 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
15180 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
15190 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
151a0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
151b0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
151c0 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
151d0 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
151e0 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
151f0 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
15200 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
15210 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
15220 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
15230 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
15240 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
15250 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
15260 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
15270 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
15280 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
15290 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
152a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
152b0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
152c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
152d0 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
152e0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
152f0 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
15300 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
15310 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
15320 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
15330 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
15340 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
15350 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
15360 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
15370 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
15380 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
15390 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
153a0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
153b0 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
153c0 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
153d0 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
153e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
153f0 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
15400 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15410 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
15420 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
15430 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
15440 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
15450 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
15460 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
15470 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15480 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
15490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
154a0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
154b0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
154c0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
154d0 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
154e0 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
154f0 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
15500 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
15510 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
15520 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
15530 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
15540 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
15550 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
15560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
15570 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
15580 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
15590 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
155a0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
155b0 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
155c0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
155d0 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
155e0 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
155f0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
15600 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
15610 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
15620 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15630 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
15640 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
15650 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
15660 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
15670 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
15680 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
15690 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
156a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
156b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
156c0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
156d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
156e0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
156f0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
15700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
15710 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
15720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15740 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
15750 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
15760 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
15770 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lOff;..        /
15780 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
15790 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
157a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
157b0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
157c0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
157d0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
157e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
157f0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
15800 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
15810 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
15820 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
15830 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
15840 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
15850 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
15860 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
15870 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
15880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15890 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
158a0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
158b0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
158c0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
158d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
158e0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
158f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
15900 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
15910 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
15920 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15930 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
15940 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15960 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
15970 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
15980 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20        jrnlOff = 
15990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
159a0 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
159b0 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
159c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
159d0 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
159e0 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66  , pPager, jrnlOf
159f0 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  f, 4));.        
15a00 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
15a10 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
15a20 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e  nlOff, pPager->n
15a30 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
15a40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a60 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
15a70 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
15a80 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
15a90 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
15aa0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
15ab0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
15ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15ad0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
15ae0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
15af0 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 28  lags| .        (
15b00 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
15b10 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
15b20 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
15b30 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
15b40 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
15b50 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
15b60 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
15b70 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
15b80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
15b90 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
15ba0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
15bb0 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
15bc0 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
15bd0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
15be0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
15bf0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
15c00 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
15c10 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
15c20 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
15c30 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
15c40 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
15c50 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
15c60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
15c70 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
15c80 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
15c90 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
15ca0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
15cb0 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
15cc0 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
15cd0 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
15ce0 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
15cf0 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
15d00 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
15d10 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
15d20 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
15d30 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
15d40 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
15d50 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
15d60 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
15d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15d80 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
15d90 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
15da0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
15db0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15dc0 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
15dd0 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
15de0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
15df0 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
15e00 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
15e10 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
15e20 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
15e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
15e40 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
15e50 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
15e60 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
15e70 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
15e80 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
15e90 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
15ea0 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
15eb0 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
15ec0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
15ed0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
15ee0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
15ef0 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
15f00 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
15f10 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
15f20 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
15f30 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
15f40 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
15f50 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
15f60 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
15f70 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
15f80 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
15f90 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
15fa0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
15fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
15fc0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
15fd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
15fe0 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
15ff0 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
16000 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
16010 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
16020 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
16030 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
16040 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
16050 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
16060 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
16070 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
16080 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
16090 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
160a0 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
160b0 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
160c0 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
160d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
160e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
160f0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
16100 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
16110 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
16120 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
16130 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
16140 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
16150 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
16160 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
16170 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
16180 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
16190 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
161a0 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
161b0 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
161c0 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
161d0 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
161e0 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
161f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
16200 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
16210 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
16220 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
16230 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
16240 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
16250 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
16260 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
16270 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
16280 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
16290 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
162a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
162b0 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
162c0 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
162d0 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
162e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
162f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
16300 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
16310 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
16320 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
16330 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
16340 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
16350 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
16360 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
16370 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
16380 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
16390 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
163a0 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
163b0 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
163c0 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
163d0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
163e0 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
163f0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
16400 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
16410 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
16420 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
16430 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
16440 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
16450 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
16460 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
16470 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
16480 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
16490 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
164a0 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
164b0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
164c0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
164d0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
164e0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
164f0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
16500 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
16510 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
16520 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
16530 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
16540 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
16550 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
16560 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
16570 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
16580 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
16590 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
165a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
165b0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
165c0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
165d0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
165e0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
165f0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
16600 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
16610 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16620 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
16630 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
16640 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
16650 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
16660 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
16670 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
16680 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
16690 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
166a0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
166b0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
166c0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
166d0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
166e0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
166f0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
16700 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
16710 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
16720 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
16730 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
16740 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
16750 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
16760 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
16770 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
16780 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
16790 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
167a0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
167b0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
167c0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
167d0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
167e0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
167f0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
16800 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
16810 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
16820 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
16830 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
16840 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
16850 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
16860 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
16870 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
16880 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
16890 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
168a0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
168b0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
168c0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
168d0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
168e0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
168f0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
16900 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
16910 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
16920 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
16930 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
16940 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
16950 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
16960 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
16970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16980 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16990 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
169a0 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
169b0 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
169c0 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  ist ){..    /* I
169d0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e  f the file has n
169e0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
169f0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
16a00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
16a10 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
16a20 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
16a30 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  t(pPager->tempFi
16a40 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  le);.      rc = 
16a50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
16a60 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66  temp(pPager->pVf
16a70 73 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  s, pPager->fd, p
16a80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
16a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
16aa0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16ab0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
16ac0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
16ad0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
16ae0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
16af0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
16b00 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
16b10 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
16b20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
16b30 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
16b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
16b50 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
16b60 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
16b70 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
16b80 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
16b90 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
16ba0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
16bb0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
16bc0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
16bd0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
16be0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
16bf0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
16c00 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
16c10 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
16c20 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
16c30 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
16c40 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
16c50 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16c60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
16c70 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
16c80 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
16c90 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
16ca0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
16cb0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
16cd0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
16ce0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
16cf0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
16d00 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
16d10 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
16d20 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
16d30 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
16d40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
16d50 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
16d60 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
16d70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
16d80 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
16d90 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16da0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
16db0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
16dc0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
16dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
16de0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
16df0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
16e00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16e10 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
16e20 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
16e30 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
16e40 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
16e50 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
16e60 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
16e70 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
16e80 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
16e90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
16ea0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
16eb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
16ec0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16ed0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
16ee0 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
16ef0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
16f00 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
16f10 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
16f20 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
16f30 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
16f40 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
16f50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16f60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16f70 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
16f80 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
16f90 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
16fa0 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
16fb0 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
16fc0 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
16fd0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
16fe0 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
16ff0 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
17000 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
17010 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
17020 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
17030 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
17040 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
17050 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
17060 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17070 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
17080 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
17090 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
170a0 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
170b0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
170c0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
170d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
170e0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
170f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17100 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
17110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
17120 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
17130 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
17140 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
17150 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
17160 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
17170 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
17180 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
17190 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
171a0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
171b0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
171c0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
171d0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
171e0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66 28 20 21  r->pVfs;.  if( !
171f0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
17200 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
17210 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 41   if( !sqlite3OsA
17220 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
17230 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
17240 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
17250 54 53 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  TS) ){.    retur
17260 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
17270 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
17280 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
17290 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74  ->fd) ){.    ret
172a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
172b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
172c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
172d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
172e0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
172f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
17300 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17310 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
17320 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
17330 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
17340 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
17350 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20   cache that can 
17360 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a  be recycled. .**
17370 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17380 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
17390 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
173a0 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f  _FULL or SQLITE_
173b0 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20  OK. It .** does 
173c0 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67  not set the pPag
173d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69  er->errCode vari
173e0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
173f0 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c  int pager_recycl
17400 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17410 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48   int syncOk, PgH
17420 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
17430 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
17440 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  g = 0;..  assert
17450 28 21 4d 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20  (!MEMDB);..  /* 
17460 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
17470 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
17480 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
17490 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
174a0 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
174b0 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
174c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
174d0 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
174e0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  ->pFirstSynced;.
174f0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
17500 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
17510 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17520 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
17530 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
17540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
17550 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
17560 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
17570 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
17580 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
17590 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
175a0 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
175b0 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
175c0 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
175d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
175e0 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
175f0 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b  pFirst && syncOk
17600 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20   && !MEMDB){.   
17610 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
17620 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
17630 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
17640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17660 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
17670 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  ){.      /* If i
17680 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
17690 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f  , write a new jo
176a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74  urnal header int
176b0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  o the.      ** j
176c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
176d0 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
176e0 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
176f0 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
17700 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
17710 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
17720 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
17730 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
17740 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17750 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
17760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
17770 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
17780 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  r is.      ** tr
17790 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
177a0 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
177b0 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  ated)..      */.
177c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
177d0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ec = 0;.      as
177e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
177f0 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a  urnalOff > 0 );.
17800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17810 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
17820 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
17830 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
17840 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17850 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
17860 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17880 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
17890 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66  pFirst;.  }.  if
178a0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
178b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
178c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
178d0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
178e0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
178f0 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
17900 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
17910 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a   is dirty..  */.
17920 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
17930 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
17940 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
17950 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
17960 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
17970 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72  g);.    pPg->dir
17980 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  ty = 1;.    pPg-
17990 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
179a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
179b0 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
179c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
179d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
179e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
179f0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
17a00 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
17a10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
17a20 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
17a30 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
17a40 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
17a50 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
17a60 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
17a70 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
17a80 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
17a90 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  he.  ** sqlite3P
17aa0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
17ab0 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
17ac0 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
17ad0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
17ae0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63  ..  ** It is nec
17af0 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
17b00 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
17b10 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
17b20 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69  Rollback.  ** mi
17b30 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
17b40 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
17b50 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
17b60 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
17b70 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ber.  ** that is
17b80 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
17b90 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
17ba0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
17bb0 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a   pages must.  **
17bc0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
17bd0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
17be0 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
17bf0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61   */.  if( pPg->a
17c00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
17c10 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41  .    IOTRACE(("A
17c20 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25  LWAYS_ROLLBACK %
17c30 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
17c40 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
17c50 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
17c60 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
17c70 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
17c80 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
17c90 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
17ca0 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  le.  */.  unlink
17cb0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73  Page(pPg);.  ass
17cc0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
17cd0 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  0 );..  *ppPg = 
17ce0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
17cf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
17d00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17d10 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
17d20 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  NT./*.** This fu
17d30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17d40 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
17d50 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
17d60 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
17d70 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
17d80 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
17d90 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
17da0 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
17db0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
17dc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
17dd0 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
17de0 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  e3_free()ed..**.
17df0 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
17e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
17e10 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
17e20 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
17e30 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
17e40 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
17e50 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68  tion returns. Th
17e60 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
17e70 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
17e80 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
17e90 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
17ea0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17eb0 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
17ec0 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
17ed0 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
17ee0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
17ef0 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   Bytes of memory
17f00 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72   released so far
17f10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
17f20 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
17f30 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75    /* The MEM2 mu
17f40 74 65 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  tex */.  Pager *
17f50 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
17f60 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
17f70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20  ing over pagers 
17f80 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 2f 2a 20 50 61 73 73 65 73 20 6f 76 65 72 20   /* Passes over 
17fb0 70 61 67 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  pagers */..  /* 
17fc0 41 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f  Acquire the memo
17fd0 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75  ry-management mu
17fe0 74 65 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78  tex.  */.  mutex
17ff0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
18000 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
18010 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
18020 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18030 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
18040 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c  .  /* Signal all
18050 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
18060 74 69 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  tions that memor
18070 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e  y management wan
18080 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20  ts.  ** to have 
18090 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 70 61  access to the pa
180a0 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  gers..  */.  for
180b0 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50  (pPager=sqlite3P
180c0 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72  agerList; pPager
180d0 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
180e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50  >pNext){.     pP
180f0 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
18100 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75   1;.  }..  /* Ou
18110 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e  termost loop run
18120 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77  s for at most tw
18130 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69  o iterations. Fi
18140 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65  rst iteration we
18150 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e  .  ** try to fin
18160 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61  d memory that ca
18170 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  n be released wi
18180 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73  thout calling fs
18190 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20  ync(). Second.  
181a0 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68  ** iteration (wh
181b0 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66  ich only runs if
181c0 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65   the first faile
181d0 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62  d to free nReq b
181e0 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d  ytes of.  ** mem
181f0 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65  ory) is permitte
18200 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28  d to call fsync(
18210 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f  ). This is of co
18220 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a  urse much more .
18230 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a    ** expensive..
18240 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18250 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  i<=1; i++){..   
18260 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
18270 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20   all the SQLite 
18280 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79  pagers opened by
18290 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
182a0 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65  ead. */.    Page
182b0 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
182c0 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20  te3PagerList;.  
182d0 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20    for( ; pPager 
182e0 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
182f0 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
18300 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
18310 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
18320 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
18330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18340 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d  ;..      /* In-m
18350 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 20  emory databases 
18360 73 68 6f 75 6c 64 20 6e 6f 74 20 61 70 70 65 61  should not appea
18370 72 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6c  r on the pager l
18380 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ist */.      ass
18390 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
183a0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61        /* Skip pa
183b0 67 65 72 73 20 74 68 61 74 20 61 72 65 20 63 75  gers that are cu
183c0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 62  rrently in use b
183d0 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
183e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  er */.      if( 
183f0 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
18400 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
18410 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20      /* For each 
18420 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72  pager, try to fr
18430 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73  ee as many pages
18440 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69   as possible (wi
18450 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  thout .      ** 
18460 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20  calling fsync() 
18470 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
18480 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
18490 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
184a0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e  .      ** loop).
184b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
184c0 77 68 69 6c 65 28 20 28 6e 52 65 71 3c 30 20 7c  while( (nReq<0 |
184d0 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71  | nReleased<nReq
184e0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
184f0 20 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63    SQLITE_OK==(rc
18500 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
18510 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
18520 29 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  )) &&.          
18530 20 20 20 70 50 67 0a 20 20 20 20 20 20 29 20 7b     pPg.      ) {
18540 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
18550 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
18560 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
18570 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
18580 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
18590 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
185a0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
185b0 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
185c0 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
185d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
185e0 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
185f0 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
18600 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
18610 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
18620 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
18630 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
18640 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
18650 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
18660 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
18670 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
18680 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
18690 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
186a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
186b0 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
186c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
186d0 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
186e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
186f0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
18700 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41   pPg==pPager->pA
18710 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
18720 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
18730 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
18740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18750 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d          for( pTm
18760 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
18770 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d  pTmp->pNextAll!=
18780 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  pPg; pTmp=pTmp->
18790 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20  pNextAll ){}.   
187a0 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65         pTmp->pNe
187b0 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  xtAll = pPg->pNe
187c0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
187d0 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73  .        nReleas
187e0 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20  ed += (.        
187f0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29      sizeof(*pPg)
18800 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
18810 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
18820 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
18830 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
18840 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
18850 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
18860 6f 72 79 29 20 0a 20 20 20 20 20 20 20 20 29 3b  ory) .        );
18870 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
18880 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20  (("PGFREE %p %d 
18890 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  *\n", pPager, pP
188a0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
188b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
188c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
188d0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
188e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
188f0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pPg);.      }.. 
18900 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18920 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
18930 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
18940 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
18950 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
18960 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
18970 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
18980 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
18990 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
189a0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
189b0 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
189c0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
189d0 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
189e0 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
189f0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  le..        ** T
18a00 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
18a10 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
18a20 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
18a30 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
18a40 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
18a50 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
18a60 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
18a70 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
18a80 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
18a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
18aa0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  ssert(.         
18ab0 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51     (rc&0xff)==SQ
18ac0 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
18ad0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
18ae0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
18af0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
18b00 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20  ITE_BUSY.       
18b10 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
18b20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18b30 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
18b40 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
18b50 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
18b60 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
18b70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
18b80 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  ear the memory m
18b90 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20  anagement flags 
18ba0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
18bb0 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72  mutex.  */.  for
18bc0 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50  (pPager=sqlite3P
18bd0 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72  agerList; pPager
18be0 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
18bf0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50  >pNext){.     pP
18c00 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
18c10 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
18c20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
18c30 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  tex);..  /* Retu
18c40 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18c50 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a   bytes released.
18c60 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52    */.  return nR
18c70 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
18c80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
18c90 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
18ca0 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  MENT */../*.** R
18cb0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
18cc0 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  of page pPg out 
18cd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18ce0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
18cf0 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
18d00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
18d10 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  Hdr *pPg, Pgno p
18d20 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
18d30 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20    i64 offset;.  
18d40 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
18d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61   );.  assert(pPa
18d60 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
18d70 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
18d80 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ile);.  if( !pPa
18d90 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
18da0 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
18db0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18dc0 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f  RT_READ;.  }.  o
18dd0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
18de0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
18df0 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  geSize;.  rc = s
18e00 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
18e10 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
18e20 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
18e30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
18e40 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f  ffset);.  PAGER_
18e50 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
18e60 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
18e70 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
18e80 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
18e90 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
18ea0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
18eb0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  , pgno));.  if( 
18ec0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d  pgno==1 ){.    m
18ed0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
18ee0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
18ef0 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
18f00 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20  pPg))[24],.     
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
18f40 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18f50 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
18f60 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
18f70 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
18f80 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
18f90 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54  PAGERTRACE4("FET
18fa0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
18fb0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
18fd0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18fe0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
18ff0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
19000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19010 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19020 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
19030 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65  obtain the share
19040 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20  d lock required 
19050 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d  before.** data m
19060 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ay be read from 
19070 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
19080 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c   If the shared l
19090 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ock has already.
190a0 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ** been obtained
190b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
190c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
190d0 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  * Immediately af
190e0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  ter obtaining th
190f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69  e shared lock (i
19100 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69  f required), thi
19110 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68  s function.** ch
19120 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a  ecks for a hot-j
19130 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
19140 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e  one is found, an
19150 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
19160 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72  ack.** is perfor
19170 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  med immediately.
19180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19190 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
191a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
191b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
191c0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
191d0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
191e0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
191f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19200 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
19210 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
19220 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19230 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
19240 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
19250 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
19260 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  k ){.        rc 
19270 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
19280 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
19290 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
192a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
192b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
192c0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
192d0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
192e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
192f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19300 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
19310 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
19320 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
19330 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
19340 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
19350 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
19360 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
19370 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
19380 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
19390 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
193a0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
193b0 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  eleted..      */
193c0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f  .      if( hasHo
193d0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
193e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   ){.        /* G
193f0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
19400 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19410 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
19420 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
19430 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
19440 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
19450 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
19460 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
19470 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
19480 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
19490 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
194a0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
194b0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
194c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
194d0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
194e0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
194f0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
19500 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
19510 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
19520 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
19530 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
19540 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
19550 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ng it .        *
19560 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  * back..        
19570 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42  ** .        ** B
19580 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
19590 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
195a0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
195b0 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
195c0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
195d0 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
195e0 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
195f0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
19600 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  l to.        ** 
19610 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
19620 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
19630 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19640 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
19650 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19660 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
19670 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
19680 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
19690 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
196a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
196b0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
196c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
196d0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
196e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
196f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19700 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
19710 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
19720 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;. .        /* O
19730 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
19740 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
19750 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
19760 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
19770 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
19780 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
19790 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
197a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
197b0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
197c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
197d0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
197e0 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
197f0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
19800 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
19810 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
19820 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
19830 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
19840 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
19850 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
19860 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
19870 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
19880 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
19890 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
198a0 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
198b0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
198c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
198d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
198e0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
198f0 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
19900 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20  use in .        
19910 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
19920 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
19930 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
19940 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
19950 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
19960 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
19970 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
19980 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
19990 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
199a0 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
199b0 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
199c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
199d0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
199e0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
199f0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
19a00 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
19a10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
19a20 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19a30 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19a40 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
19a50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
19a60 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
19a70 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20  S_EXISTS) ){.   
19a80 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
19a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
19aa0 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nt flags = SQLIT
19ab0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
19ac0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
19ad0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
19ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
19af0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
19b00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
19b10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
19b20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
19b30 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
19b40 66 64 2c 20 66 6c 61 67 73 2c 26 66 6f 75 74 29  fd, flags,&fout)
19b50 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
19b60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
19b70 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
19b80 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
19b90 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74          if( fout
19ba0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
19bb0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
19bc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19bd0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
19be0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19bf0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
19c00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
19c20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
19c40 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
19c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
19c60 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
19c70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19c80 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19c90 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
19ca0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19cb0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
19cc0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19cd0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
19ce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19cf0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
19d00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
19d10 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
19d20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
19d30 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
19d40 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
19d50 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
19d60 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
19d70 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
19d80 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
19d90 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
19da0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
19db0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
19dc0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
19dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
19df0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
19e00 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
19e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
19e20 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
19e30 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
19e40 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
19e50 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
19e60 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
19e70 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
19e80 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
19e90 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
19ea0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
19eb0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
19ec0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
19ed0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
19ee0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
19ef0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
19f00 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
19f10 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
19f20 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
19f30 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
19f40 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
19f50 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
19f60 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
19f70 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
19f80 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
19f90 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
19fa0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
19fb0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
19fc0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
19fd0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
19fe0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
19ff0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1a000 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1a010 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1a020 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1a030 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
1a040 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
1a050 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
1a060 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
1a070 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
1a080 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
1a090 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
1a0a0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
1a0b0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
1a0c0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
1a0d0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
1a0e0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
1a0f0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
1a100 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
1a110 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
1a120 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
1a130 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
1a140 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
1a150 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
1a160 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
1a170 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
1a180 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1a190 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1a1a0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1a1b0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1a1c0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
1a1d0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1a1e0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1a1f0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
1a200 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
1a210 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1a220 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
1a230 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1a240 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
1a250 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a260 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1a270 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
1a280 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1a290 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a2a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1a2b0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1a2c0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
1a2d0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
1a2e0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
1a2f0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
1a300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a310 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1a320 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1a330 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1a340 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1a350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a370 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a3a0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
1a3b0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
1a3c0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
1a3d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a3e0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
1a3f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1a400 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1a410 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1a420 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a430 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1a440 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
1a450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a460 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a470 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1a480 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
1a490 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
1a4a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a4b0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1a4c0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1a4d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1a4e0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1a4f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1a500 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1a510 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20  llocate a PgHdr 
1a520 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72  object.   Either
1a530 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1a540 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e  e or reuse.** an
1a550 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68   existing one th
1a560 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  at is not otherw
1a570 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ise in use..**.*
1a580 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74  * A new PgHdr st
1a590 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1a5a0 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
1a5b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a   following are.*
1a5c0 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * true:.**.**   
1a5d0 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e    (1)  We have n
1a5e0 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20  ot exceeded our 
1a5f0 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65  maximum allocate
1a600 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  d cache size.** 
1a610 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20           as set 
1a620 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63  by the "PRAGMA c
1a630 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61  ache_size" comma
1a640 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  nd..**.**     (2
1a650 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1a660 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a  unused PgHdr obj
1a670 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61  ects available a
1a680 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a  t this time..**.
1a690 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73  **     (3)  This
1a6a0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1a6b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1a6c0 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20       (4)  There 
1a6d0 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a  are no PgHdr obj
1a6e0 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ects that do not
1a6f0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1a700 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  al.**          f
1a710 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73  ile sync and a s
1a720 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ync of the journ
1a730 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  al file is curre
1a740 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1a750 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a   prohibited..**.
1a760 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
1a770 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
1a780 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72  PgHdr.  In other
1a790 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e   words, reuse an
1a7a0 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48  .** existing PgH
1a7b0 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  dr if all of the
1a7c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1a7d0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1a7e0 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63  1)  We have reac
1a7f0 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20  hed or exceeded 
1a800 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68  the maximum cach
1a810 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1a820 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50     allowed by "P
1a830 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1a840 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  "..**.**     (2)
1a850 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48    There is a PgH
1a860 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  dr available wit
1a870 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30  h PgHdr->nRef==0
1a880 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1a890 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e  We are not in an
1a8a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1a8b0 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  ase.**.**     (4
1a8c0 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20  )  Either there 
1a8d0 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20  is an available 
1a8e0 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20  PgHdr that does 
1a8f0 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  not need.**     
1a900 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65       to be synce
1a910 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73  d to disk or els
1a920 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69  e disk syncing i
1a930 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1a940 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e          allowed.
1a950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a960 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1a970 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a980 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
1a990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a9a0 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
1a9b0 67 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  g;..  /* Create 
1a9c0 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61  a new PgHdr if a
1a9d0 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63  ny of the four c
1a9e0 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65  onditions define
1a9f0 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72  d .  ** above ar
1aa00 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  e met: */.  if( 
1aa10 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1aa20 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1aa30 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
1aa40 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44  t==0 .   || MEMD
1aa50 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  B.   || (pPager-
1aa60 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
1aa70 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
1aa80 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20  tSync).  ){.    
1aa90 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1aaa0 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
1aab0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1aac0 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
1aad0 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
1aae0 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
1aaf0 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
1ab00 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
1ab10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1ab20 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
1ab30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ab40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1ab50 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1ab60 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
1ab70 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1ab80 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1ab90 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1aba0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
1abb0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
1abc0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
1abf0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1ac00 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
1ac30 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
1ac40 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1ac50 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1ac60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1ac70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1ac80 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1ac90 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1aca0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
1acb0 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
1acc0 70 50 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  pPg));.    if( M
1acd0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65  EMDB ){.      me
1ace0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
1acf0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
1ad00 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
1ad10 74 6f 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20  tory));.    }.  
1ad20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
1ad30 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
1ad40 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
1ad50 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50  er->pAll;.    pP
1ad60 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
1ad70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50  ;.    pPager->nP
1ad80 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  age++;.  }else{.
1ad90 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61      /* Recycle a
1ada0 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
1adb0 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d  with a zero ref-
1adc0 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63  count. */.    rc
1add0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
1ade0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
1adf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ae00 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1ae10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ae20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
1ae30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1ae40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ae50 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1ae60 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1ae70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1ae80 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1ae90 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1aea0 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
1aeb0 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  }.  *ppPg = pPg;
1aec0 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  ..pager_allocate
1aed0 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  _out:.  return r
1aee0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1aef0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1af00 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1af10 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1af20 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1af30 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1af40 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1af50 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1af60 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1af70 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1af80 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1af90 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1afa0 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1afb0 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1afc0 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1afd0 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1afe0 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1aff0 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1b000 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1b010 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1b020 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1b030 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1b040 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b050 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20  >needRead ){.   
1b060 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62   int rc = readDb
1b070 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72  Page(pPg->pPager
1b080 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f  , pPg, pPg->pgno
1b090 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1b0a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b0b0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1b0c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1b0d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b100 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1b110 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1b120 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b130 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1b140 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1b150 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1b160 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1b170 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1b180 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1b190 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1b1a0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1b1b0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1b1c0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1b1d0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1b1e0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1b1f0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1b200 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1b210 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1b220 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1b230 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1b240 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1b250 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1b260 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1b270 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1b280 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1b290 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1b2a0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1b2b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1b2c0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1b2d0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1b2e0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1b2f0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1b300 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1b310 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1b320 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1b330 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1b340 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1b350 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b360 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1b370 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1b380 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1b390 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1b3a0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1b3b0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1b3c0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1b3d0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1b3e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1b3f0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1b400 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1b410 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1b420 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1b430 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1b440 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1b450 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1b460 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1b470 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1b480 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1b490 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1b4a0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1b4b0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1b4c0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1b4d0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1b4e0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1b4f0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1b500 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1b510 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1b520 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1b530 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1b540 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b550 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1b560 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1b570 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1b580 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1b590 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1b5a0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1b5b0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1b5c0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1b5d0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1b5e0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1b5f0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1b600 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1b610 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1b620 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1b630 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1b640 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1b650 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1b660 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1b670 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1b680 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1b690 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1b6a0 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1b6b0 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1b6c0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1b6d0 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1b6e0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1b6f0 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1b700 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1b710 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1b720 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1b730 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1b740 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1b750 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1b760 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1b770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1b780 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1b790 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1b7a0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1b7b0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1b7c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1b7d0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1b7e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1b7f0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1b800 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1b810 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1b820 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1b830 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1b840 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1b850 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1b860 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1b870 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1b880 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1b890 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1b8a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b8b0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1b8c0 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
1b8d0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1b8e0 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
1b8f0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1b900 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1b910 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1b920 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1b930 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1b940 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1b950 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1b960 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1b970 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1b980 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1b990 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1b9a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1b9b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b9c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b9d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1b9e0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1b9f0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1ba00 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1ba10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ba20 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1ba30 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
1ba40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1ba50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1ba60 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1ba70 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1ba80 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1ba90 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1baa0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1bab0 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
1bac0 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
1bad0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
1bae0 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
1baf0 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
1bb00 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
1bb10 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
1bb20 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
1bb30 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
1bb40 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1bb50 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
1bb60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bb70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1bb80 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1bb90 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1bba0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50  _UNLOCK );..  pP
1bbb0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1bbc0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1bbd0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1bbe0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1bbf0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
1bc00 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1bc10 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  he. */.    int n
1bc20 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  Max;.    int h;.
1bc30 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1bc40 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
1bc50 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c     rc = pagerAll
1bc60 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72  ocatePage(pPager
1bc70 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1bc80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bc90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1bca0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  c;.    }..    pP
1bcb0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1bcc0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1bcd0 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65  DB || pgno>pPage
1bce0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20  r->stmtSize );. 
1bcf0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
1bd00 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
1bd10 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
1bd20 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 23 69  origDbSize ){.#i
1bd30 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f 0.      sqlite
1bd40 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
1bd50 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
1bd60 20 70 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66   pgno/8);.#endif
1bd70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bd80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1bd90 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
1bda0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
1bdb0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bdc0 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
1bdd0 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
1bde0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1bdf0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
1be00 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
1be10 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1be20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1be30 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1be40 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1be50 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
1be60 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
1be70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  Pg);..    pPager
1be80 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66  ->nRef++;.    if
1be90 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
1bea0 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
1beb0 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
1bec0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
1bed0 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
1bee0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  a);.    }.    nM
1bef0 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ax = sqlite3Page
1bf00 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1bf10 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  r);.    if( pPag
1bf20 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1bf30 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1bf40 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1bf50 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1bf60 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
1bf70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1bf80 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
1bf90 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64   the page with d
1bfa0 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72  ata, either by r
1bfb0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1bfc0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1bfd0 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74  file, or by sett
1bfe0 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
1bff0 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  age to zero..   
1c000 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   */.    if( nMax
1c010 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
1c020 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e  MDB || (noConten
1c030 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c  t && !pPager->al
1c040 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b  waysRollback) ){
1c050 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1c060 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1c070 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c080 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1c090 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c0a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1c0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
1c0c0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
1c0d0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
1c0e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c0f0 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
1c100 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20   = noContent && 
1c110 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
1c120 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49  ollback;.      I
1c130 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
1c140 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1c150 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
1c160 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1c170 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c  adDbPage(pPager,
1c180 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20   pPg, pgno);.   
1c190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c1a0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1c1b0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1c1c0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EAD ){.        p
1c1d0 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
1c1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c1f0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1c200 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c220 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
1c230 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c240 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e  Link the page in
1c250 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68  to the page hash
1c260 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20   table */.    h 
1c270 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
1c280 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
1c290 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
1c2a0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
1c2b0 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1c2c0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
1c2d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
1c2e0 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
1c2f0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
1c300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c310 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
1c320 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
1c330 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1c340 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
1c350 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  pPg;.    }..#ifd
1c360 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c370 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
1c380 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1c390 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1c3a0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1c3b0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1c3c0 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
1c3d0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
1c3e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  /.    assert(pPa
1c3f0 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
1c400 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47  gno==1);.    PAG
1c410 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1c420 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21  nHit);.    if( !
1c430 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
1c440 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65     rc = pager_ge
1c450 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1c460 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1c470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c480 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1c490 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
1c4a0 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
1c4b0 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
1c4c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1c4d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
1c4e0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1c4f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1c500 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1c510 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c520 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1c530 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1c540 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1c550 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1c560 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1c570 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1c580 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1c590 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1c5a0 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1c5b0 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1c5c0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1c5d0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1c5e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1c5f0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1c600 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
1c610 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
1c620 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e   pgno, ppPage, n
1c630 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67  oContent);.  pag
1c640 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1c650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c660 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1c670 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
1c680 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
1c690 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
1c6a0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
1c6b0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
1c6c0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
1c6d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
1c6e0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
1c6f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1c700 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
1c710 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1c720 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
1c730 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1c740 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1c750 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
1c760 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
1c770 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
1c780 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
1c790 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
1c7a0 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
1c7b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
1c7c0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
1c7d0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1c7e0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
1c7f0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1c800 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
1c810 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
1c820 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
1c830 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
1c840 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
1c850 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1c860 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1c870 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73   *pPg = 0;..  as
1c880 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1c890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
1c8a0 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72  o!=0 );..  pager
1c8b0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1c8c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c8d0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1c8e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c8f0 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c  !pPager->pAll ||
1c900 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1c910 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73  veMode );.  }els
1c920 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
1c930 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1c940 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1c950 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20  _FULL ){.    /* 
1c960 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
1c970 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d  }else if( (pPg =
1c980 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1c990 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20  ager, pgno))!=0 
1c9a0 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  ){.    page_ref(
1c9b0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
1c9c0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1c9d0 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
1c9e0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
1c9f0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1ca00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
1ca10 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1ca20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
1ca30 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
1ca40 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
1ca50 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
1ca60 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
1ca70 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
1ca80 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
1ca90 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1caa0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
1cab0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cac0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
1cad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1cae0 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
1caf0 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72  pPg){..  /* Decr
1cb00 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
1cb10 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
1cb20 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61  is page.  */.  a
1cb30 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1cb40 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  >0 );.  pagerEnt
1cb50 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
1cb60 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
1cb70 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
1cb80 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1cb90 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
1cba0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1cbb0 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
1cbc0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
1cbd0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
1cbe0 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
1cbf0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
1cc00 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
1cc10 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
1cc20 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1cc30 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
1cc40 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1cc50 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
1cc60 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
1cc70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
1cc80 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
1cc90 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
1cca0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
1ccb0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
1ccc0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
1ccd0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
1cce0 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
1ccf0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
1cd00 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
1cd10 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
1cd20 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
1cd30 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
1cd40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
1cd50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
1cd60 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
1cd70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1cd80 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
1cd90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
1cda0 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
1cdb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1cdc0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1cdd0 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
1cde0 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
1cdf0 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
1ce00 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
1ce10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1ce20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
1ce30 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
1ce40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ce50 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
1ce60 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ce70 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61  nRef==0 && (!pPa
1ce80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1ce90 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
1cea0 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20  urnalOff>0) ){. 
1ceb0 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
1cec0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
1ced0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1cee0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
1cef0 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
1cf00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1cf10 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1cf20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1cf30 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1cf40 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1cf50 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1cf60 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1cf70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1cf80 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1cf90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1cfa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1cfb0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1cfc0 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1cfd0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1cfe0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1cff0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1d000 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1d010 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1d020 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1d030 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1d040 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
1d050 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1d060 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
1d070 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
1d080 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1d090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1d0a0 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
1d0b0 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e  N_CREATE);..  in
1d0c0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1d0d0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1d0e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1d0f0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1d100 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1d110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d120 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
1d130 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
1d140 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
1d150 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1d160 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  urnal==0 );.  sq
1d170 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1d180 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
1d190 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1d1a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1d1b0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1d1c0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61  3MallocZero( pPa
1d1d0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1d1e0 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  1 );.  pagerEnte
1d1f0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
1d200 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1d210 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
1d220 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1d230 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1d240 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1d250 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1d260 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1d270 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53  .    flags |= (S
1d280 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1d290 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
1d2a0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1d2b0 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  L);.  }else{.   
1d2c0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
1d2d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1d2e0 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  NAL);.  }.#ifdef
1d2f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1d300 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63  TOMIC_WRITE.  rc
1d310 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
1d320 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66  lOpen(.      pVf
1d330 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1d340 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1d350 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
1d360 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
1d370 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20    );.#else.  rc 
1d380 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1d390 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1d3a0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1d3b0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
1d3c0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
1d3d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1d3e0 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1d3f0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61  Methods );.  pPa
1d400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d410 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1d420 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
1d430 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d440 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
1d450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d470 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
1d480 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1d490 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1d4a0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
1d4b0 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c   }.    goto fail
1d4c0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1d4d0 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1d4e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1d4f0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
1d500 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1d510 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
1d520 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
1d530 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1d540 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
1d550 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
1d560 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1d580 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1d590 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1d5a0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1d5b0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
1d5c0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1d5d0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
1d5e0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1d5f0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
1d600 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
1d610 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
1d620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d630 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d640 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
1d650 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1d660 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1d670 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
1d680 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1d690 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1d6a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1d6b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d6c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d6d0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1d6e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d6f0 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
1d700 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
1d710 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
1d720 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
1d730 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1d740 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
1d750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1d760 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
1d770 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1d780 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
1d790 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
1d7a0 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
1d7b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
1d7c0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
1d7d0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1d7e0 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
1d7f0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1d800 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1d810 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
1d820 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1d830 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
1d840 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1d850 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d860 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1d870 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
1d880 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
1d890 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
1d8a0 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
1d8b0 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
1d8c0 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
1d8d0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
1d8e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
1d8f0 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
1d900 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
1d910 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
1d920 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
1d930 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1d940 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1d950 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
1d960 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
1d970 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1d980 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d990 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
1d9a0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
1d9b0 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
1d9c0 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
1d9d0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
1d9e0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1d9f0 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
1da00 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1da10 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
1da20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
1da30 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
1da40 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
1da50 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
1da60 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
1da70 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
1da80 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
1da90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1daa0 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
1dab0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
1dac0 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
1dad0 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
1dae0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1daf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1db00 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
1db10 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
1db20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1db30 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1db40 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
1db50 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
1db60 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
1db70 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
1db80 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
1db90 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
1dba0 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
1dbb0 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
1dbc0 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
1dbd0 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
1dbe0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1dbf0 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
1dc00 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1dc10 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
1dc20 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
1dc30 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
1dc40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1dc50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1dc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61   SQLITE_OK;.  pa
1dc70 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1dc80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1dc90 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1dca0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dcb0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1dcc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1dcd0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1dce0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1dcf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1dd00 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1dd10 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1dd20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1dd30 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1dd40 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
1dd50 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1dd60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1dd70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dd80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1dd90 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1dda0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
1ddb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ddc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ddd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1dde0 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1ddf0 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
1de00 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1de10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1de20 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1de30 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1de40 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
1de50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1de60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1de70 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c  {.        pagerL
1de80 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1de90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1deb0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1dec0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1ded0 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1dee0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1def0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1df00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1df10 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1df20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1df30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1df40 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1df50 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1df60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1df70 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1df80 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1df90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1dfa0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1dfb0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1dfc0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1dfd0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1dfe0 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1dff0 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1e000 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1e010 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1e020 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1e030 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1e040 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1e050 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1e060 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e070 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1e080 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1e090 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1e0a0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1e0b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1e0c0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1e0d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1e0e0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1e0f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e100 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1e110 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1e120 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1e130 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
1e140 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1e150 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1e160 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
1e170 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
1e180 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1e190 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65  );.    pagerEnte
1e1a0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1e1b0 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1e1c0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1e1d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e1e0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1e1f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1e200 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1e210 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1e220 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1e230 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1e240 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1e250 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1e260 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1e270 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1e280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e290 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
1e2a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1e2c0 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
1e2d0 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
1e2e0 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
1e2f0 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
1e300 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1e310 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
1e320 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
1e330 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1e340 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
1e350 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1e360 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1e370 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1e380 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
1e390 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
1e3a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
1e3b0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1e3c0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
1e3d0 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
1e3e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
1e3f0 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
1e400 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1e410 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
1e420 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1e430 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
1e440 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
1e450 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
1e460 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
1e470 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
1e480 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
1e490 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
1e4a0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1e4b0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
1e4c0 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1e4d0 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
1e4e0 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
1e4f0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1e500 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
1e510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1e520 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
1e530 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1e540 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d  vDirty->pDirty =
1e550 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1e560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e570 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
1e580 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
1e590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1e5a0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
1e5b0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
1e5c0 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
1e5d0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1e5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
1e5f0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1e600 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
1e610 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
1e620 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
1e630 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
1e640 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
1e650 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1e660 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e670 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
1e680 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
1e690 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
1e6a0 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
1e6b0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
1e6c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
1e6d0 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
1e6e0 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
1e6f0 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
1e700 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1e710 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
1e720 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
1e730 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
1e740 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
1e750 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
1e760 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
1e770 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
1e780 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
1e790 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1e7a0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
1e7b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e7c0 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
1e7d0 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
1e7e0 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
1e7f0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
1e800 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1e810 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
1e820 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
1e830 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
1e840 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
1e850 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
1e860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1e870 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
1e880 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
1e890 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1e8a0 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
1e8b0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
1e8c0 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
1e8d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1e8e0 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
1e8f0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
1e900 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
1e910 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a  (pPg);.  Pager *
1e920 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e930 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1e940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1e950 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
1e960 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
1e970 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1e980 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
1e990 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1e9a0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1e9b0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1e9c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
1e9d0 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
1e9e0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
1e9f0 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
1ea00 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1ea10 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
1ea20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1ea30 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1ea40 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
1ea50 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
1ea60 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
1ea70 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
1ea80 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
1ea90 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
1eaa0 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
1eab0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
1eac0 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
1ead0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1eae0 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
1eaf0 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
1eb00 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
1eb10 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
1eb20 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
1eb30 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
1eb40 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
1eb50 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
1eb60 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
1eb70 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
1eb80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1eb90 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
1eba0 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
1ebb0 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
1ebc0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1ebd0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
1ebe0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1ebf0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1ec00 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1ec10 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
1ec20 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
1ec30 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
1ec40 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
1ec50 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
1ec60 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
1ec70 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69  y..  */.  makeDi
1ec80 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
1ec90 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1eca0 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & (pageInStateme
1ecb0 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65  nt(pPg) || pPage
1ecc0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
1ecd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1ece0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1ecf0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
1ed00 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
1ed10 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
1ed20 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1ed30 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
1ed40 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
1ed50 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1ed60 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
1ed70 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
1ed80 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
1ed90 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
1eda0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
1edb0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1edc0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
1edd0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
1ede0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
1edf0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
1ee00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ee10 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1ee20 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
1ee30 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1ee40 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  in(pPg, 0);.    
1ee50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ee60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1ee70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ee80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ee90 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1eea0 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
1eeb0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1eec0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
1eed0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
1eee0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1eef0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1ef00 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1ef10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ef20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ef30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ef40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1ef50 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
1ef60 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
1ef70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ef80 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  e = 1;.  .    /*
1ef90 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1efa0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
1efb0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
1efc0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
1efd0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1efe0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
1eff0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1f000 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
1f010 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
1f020 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
1f030 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
1f040 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1f050 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
1f060 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a     if( !pPg->inJ
1f070 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
1f080 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
1f090 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20   MEMDB) ){.     
1f0a0 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
1f0b0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1f0c0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1f0d0 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
1f0e0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
1f0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
1f100 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1f110 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1f120 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1f130 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f140 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
1f150 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1f160 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1f170 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1f180 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
1f190 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
1f1a0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
1f1b0 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rig = sqlite3_ma
1f1c0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
1f1d0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1f1e0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1f1f0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
1f200 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
1f210 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
1f220 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1f230 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f260 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20       u32 cksum, 
1f270 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20  saved;.         
1f280 20 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a   char *pData2, *
1f290 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20 20 20 20  pEnd;..         
1f2a0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
1f2b0 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
1f2c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1f2d0 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
1f2e0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
1f2f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
1f300 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
1f310 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
1f320 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  fies.          *
1f330 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
1f340 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
1f350 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1f360 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1f370 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1f380 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
1f390 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1f3a0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1f3b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
1f3c0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
1f3d0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
1f3e0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ata2);.         
1f3f0 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b   pEnd = pData2 +
1f400 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1f410 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  e;.          pDa
1f420 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ta2 -= 4;.      
1f430 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
1f440 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20  2*)pEnd;.       
1f450 20 20 20 70 75 74 33 32 62 69 74 73 28 70 45 6e     put32bits(pEn
1f460 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  d, cksum);.     
1f470 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67       szPg = pPag
1f480 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a  er->pageSize+8;.
1f490 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62            put32b
1f4a0 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d  its(pData2, pPg-
1f4b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1f4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f4d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
1f4e0 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50 67 2c  d, pData2, szPg,
1f4f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f500 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Off);.          
1f510 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
1f520 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
1f530 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1f540 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1f550 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1f560 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29  ournalOff, szPg)
1f570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
1f580 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1f590 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
1f5a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nt);.          p
1f5b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f5c0 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
1f5d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35       PAGERTRACE5
1f5e0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1f5f0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
1f600 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1f620 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1f630 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1f640 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f  needSync, pager_
1f650 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
1f660 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a            *(u32*
1f670 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a  )pEnd = saved;..
1f680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
1f690 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
1f6a0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
1f6b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1f6c0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
1f6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1f6e0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
1f6f0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
1f700 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
1f710 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1f720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f730 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1f740 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1f750 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
1f760 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
1f770 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1f780 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1f790 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
1f7a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1f7b0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
1f7c0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1f7d0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1f7e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1f7f0 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
1f800 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
1f810 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1f820 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
1f830 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1f840 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1f850 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1f860 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &7);.          }
1f870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f890 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1f8a0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1f8b0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1f8c0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1f8d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1f8e0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1f8f0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1f900 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f910 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1f920 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1f930 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1f940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f950 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1f960 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1f970 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1f980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1f990 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1f9a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1f9b0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1f9c0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1f9d0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1f9e0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1f9f0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1fa00 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1fa10 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1fa20 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1fa30 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1fa40 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1fa50 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1fa60 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1fa70 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1fa80 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1fa90 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1faa0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1fab0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1fac0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1fad0 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20  stmtInUse .     
1fae0 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d  && !pageInStatem
1faf0 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26  ent(pPg) .     &
1fb00 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1fb10 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1fb20 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
1fb30 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1fb40 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1fb50 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1fb60 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1fb70 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1fb80 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1fb90 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1fba0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1fbb0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1fbc0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
1fbd0 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
1fbe0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1fbf0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
1fc00 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  oc( pPager->page
1fc10 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1fc20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1fc30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1fc40 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1fc50 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1fc60 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1fc70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1fc80 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1fc90 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1fca0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1fcb0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1fcc0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1fcd0 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
1fce0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1fcf0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
1fd00 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f  e{.        i64 o
1fd10 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1fd20 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67  stmtNRec*(4+pPag
1fd30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fd40 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1fd50 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1fd60 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1fd70 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20  >pgno, 7)-4;.   
1fd80 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1fd90 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1fda0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1fdb0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1fdc0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1fdd0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1fde0 65 53 69 7a 65 2b 34 2c 20 6f 66 66 73 65 74 29  eSize+4, offset)
1fdf0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1fe00 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1fe10 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1fe20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1fe30 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1fe40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1fe50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fe70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fe80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1fe90 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
1fea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1feb0 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1fec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1fed0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1fee0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1fef0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
1ff00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff10 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1ff20 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1ff30 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1ff40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ff50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1ff60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1ff70 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1ff80 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1ff90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1ffa0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1ffb0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1ffc0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1ffd0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1ffe0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1fff0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
20000 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
20010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20030 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
20040 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
20050 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
20060 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
20070 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
20080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
20090 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
200a0 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
200b0 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
200c0 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
200d0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
200e0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
200f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
20100 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
20110 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
20120 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
20130 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
20140 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
20150 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
20160 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
20170 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
20180 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
20190 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
201a0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
201b0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
201c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
201d0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
201e0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
201f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
20200 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
20210 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20220 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
20230 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
20240 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
20250 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
20260 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
20270 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
20280 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
20290 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
202a0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
202b0 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
202c0 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
202d0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
202e0 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
202f0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
20300 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20310 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
20320 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
20330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20340 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
20350 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
20360 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
20370 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
20380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20390 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
203a0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
203b0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
203c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
203d0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
203e0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
203f0 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
20400 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
20410 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
20420 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
20430 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
20440 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
20450 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
20460 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
20470 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
20480 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
20490 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
204a0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
204b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
204c0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
204d0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
204e0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
204f0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
20500 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
20510 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
20520 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
20530 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
20540 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
20550 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
20560 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
20570 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
20580 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
20590 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
205a0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
205b0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
205c0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
205d0 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
205e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
205f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
20600 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
20610 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
20620 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
20630 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
20640 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
20650 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
20660 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
20670 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
20680 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
20690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
206a0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
206b0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
206c0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
206d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
206e0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
206f0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
20700 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
20710 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
20720 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
20730 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
20740 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
20750 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
20760 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
20770 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
20780 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67  aInJournal || pg
20790 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a  ==pPg->pgno || .
207a0 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61            pg>pPa
207b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
207c0 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  || !(pPager->aIn
207d0 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31  Journal[pg/8]&(1
207e0 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20  <<(pg&7))).     
207f0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   ) {.        if(
20800 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
20810 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
20820 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20830 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
20840 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
20850 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20870 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
20880 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
20890 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
208a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
208b0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
208c0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
208d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
208e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
208f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20900 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
20910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
20920 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
20930 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
20940 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
20950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
20960 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
20970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
20980 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
20990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
209a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
209b0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
209c0 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  c flag is set fo
209d0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
209e0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
209f0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
20a00 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
20a10 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
20a20 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
20a30 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
20a40 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
20a50 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
20a60 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
20a70 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
20a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
20a90 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
20aa0 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
20ab0 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
20ac0 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
20ad0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
20ae0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
20af0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
20b00 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
20b10 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ync ){.      for
20b20 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
20b30 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b  && needSync; ii+
20b40 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
20b50 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
20b60 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
20b70 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
20b80 20 69 66 28 20 70 50 61 67 65 20 29 20 70 50 61   if( pPage ) pPa
20b90 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  ge->needSync = 1
20ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20bb0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
20bc0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
20bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20be0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
20bf0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
20c00 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
20c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20c20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
20c30 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61  bPage);.  }.  pa
20c40 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20c60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
20c70 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
20c80 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
20c90 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
20ca0 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
20cb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
20cc0 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
20cd0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
20ce0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
20cf0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
20d00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
20d10 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
20d20 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
20d30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
20d40 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
20d50 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
20d60 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dirty;.}.#endif.
20d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20d80 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
20d90 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
20da0 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
20db0 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
20dc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
20dd0 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
20de0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
20df0 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
20e00 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
20e10 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
20e20 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
20e30 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
20e40 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  c;..  pagerEnter
20e50 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
20e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20e70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
20e80 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pPg);.  if( rc==
20e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20eb0 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
20ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
20ee0 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72  cpy(sqlite3Pager
20ef0 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44  GetData(pPg), pD
20f00 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
20f10 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
20f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20f30 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
20f40 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
20f50 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
20f60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20f70 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
20f80 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
20f90 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
20fa0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
20fb0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
20fc0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
20fd0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
20fe0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
20ff0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
21000 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
21010 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
21020 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
21030 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
21040 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
21050 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
21060 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
21070 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
21080 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
21090 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
210a0 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
210b0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
210c0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
210d0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
210e0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
210f0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
21100 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
21110 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
21120 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
21130 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
21140 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
21150 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
21160 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
21170 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
21180 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
21190 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
211a0 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
211b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
211c0 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
211d0 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
211e0 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
211f0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
21200 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
21210 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
21220 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
21230 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
21240 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
21250 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
21260 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
21270 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
21280 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
21290 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
212a0 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
212b0 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
212c0 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
212d0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
212e0 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
212f0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
21300 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
21310 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
21320 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
21330 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
21340 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
21350 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
21360 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21370 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
21380 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
21390 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
213a0 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
213b0 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
213c0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
213d0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
213e0 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
213f0 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
21400 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
21410 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
21420 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
21430 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
21440 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
21450 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21460 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
21470 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
21480 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
21490 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
214a0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
214b0 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
214c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67   ) return;.  pag
214d0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
214e0 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
214f0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
21500 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20  ( pPg->dirty && 
21510 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
21520 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
21530 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
21540 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
21550 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21560 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
21570 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
21580 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
21590 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
215a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
215b0 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
215c0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
215d0 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
215e0 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
215f0 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
21600 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
21610 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
21620 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
21630 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
21640 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
21650 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
21660 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
21670 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
21680 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
21690 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
216a0 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
216b0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
216c0 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
216d0 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
216e0 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
216f0 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
21700 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
21710 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
21720 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
21730 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
21740 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
21750 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
21760 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
21770 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
21780 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
21790 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
217a0 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
217b0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
217c0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
217d0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
217e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
217f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
21800 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
21810 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
21820 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
21830 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
21840 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
21850 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
21860 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
21870 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
21880 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
21890 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
218a0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
218b0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
218c0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
218d0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
218e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
218f0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
21900 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
21910 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
21920 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
21930 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
21940 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
21950 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
21960 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
21970 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
21980 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
21990 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61  ..**.** If we ha
219a0 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61  ve not yet actua
219b0 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e  lly read the con
219c0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  tent of this pag
219d0 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48  e (if.** the PgH
219e0 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
219f0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68   is set) then th
21a00 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
21a10 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20  as a promise.** 
21a20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76  that we will nev
21a30 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20  er need to read 
21a40 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
21a50 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
21a60 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65  ** so the needRe
21a70 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63  ad flag can be c
21a80 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70  leared at this p
21a90 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oint..*/.void sq
21aa0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
21ab0 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70  llback(DbPage *p
21ac0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
21ad0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21ae0 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  er;..  pagerEnte
21af0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
21b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
21b10 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
21b20 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
21b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
21b40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
21b50 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
21b60 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
21b70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
21b80 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
21b90 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
21ba0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
21bb0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
21bc0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21bd0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
21be0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
21bf0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
21c00 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
21c10 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
21c20 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
21c30 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
21c40 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70  urnal = 1;.    p
21c50 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
21c60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
21c70 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
21c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
21c90 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
21ca0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
21cb0 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20  no&7);.    }.   
21cc0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
21cd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
21ce0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
21cf0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
21d00 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49  (pPager));.    I
21d10 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
21d20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
21d30 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
21d40 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
21d50 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26  >stmtInUse .   &
21d60 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
21d70 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28  nt(pPg) .   && (
21d80 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
21d90 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21da0 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
21db0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
21dc0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
21dd0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
21de0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
21df0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
21e00 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
21e10 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
21e20 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
21e30 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
21e40 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
21e50 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
21e60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21e70 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
21e80 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
21e90 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
21ea0 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
21eb0 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
21ec0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
21ed0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21ee0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
21ef0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
21f00 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
21f10 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
21f20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
21f30 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
21f40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21f50 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
21f60 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
21f70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
21f80 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
21f90 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
21fa0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
21fb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
21fc0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
21fd0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
21fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21ff0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
22000 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
22010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22020 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
22030 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
22040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
22060 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
22070 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
22080 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
22090 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
220a0 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
220b0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
220c0 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
220d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
220e0 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f  rs);.    change_
220f0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
22100 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
22110 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
22120 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
22130 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
22140 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26    if( isDirect &
22150 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
22160 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
22170 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
22180 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
22190 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
221a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
221b0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
221c0 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
221d0 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
221e0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
221f0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
22200 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
22210 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
22220 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
22230 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
22240 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
22250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22260 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
22270 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
22280 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
22290 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
222a0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
222b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
222c0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
222d0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
222e0 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
222f0 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
22300 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
22310 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
22320 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
22330 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
22340 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
22350 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
22360 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
22370 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
22380 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
22390 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
223a0 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
223b0 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
223c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
223d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
223e0 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
223f0 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
22400 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
22410 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
22420 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
22430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22440 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
22450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
22460 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
22470 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
22480 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
22490 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
224a0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
224b0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
224c0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
224d0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
224e0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
224f0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
22500 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
22510 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
22520 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
22530 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
22540 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
22550 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
22560 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
22570 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22580 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
22590 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
225a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
225b0 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
225c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
225d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52  ITE_OK;..  PAGER
225e0 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
225f0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
22600 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
22610 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
22620 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
22630 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
22640 63 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  c);.  pagerEnter
22650 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
22660 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
22670 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
22680 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
22690 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
226a0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
226b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
226c0 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
226d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
226e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
226f0 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
22700 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
22710 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22720 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
22730 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
22740 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
22750 6c 4f 70 65 6e 20 29 3b 0a 0a 23 69 66 64 65 66  lOpen );..#ifdef
22760 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
22770 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
22780 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72  /* The atomic-wr
22790 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
227a0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
227b0 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  all of the.    *
227c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  * following are 
227d0 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  true:.    **.   
227e0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c   **    + The fil
227f0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
22800 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
22810 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
22820 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
22830 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
22840 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  size, and.    **
22850 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69      + This commi
22860 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
22870 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
22880 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
22890 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74     **    + Exact
228a0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
228b0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
228c0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
228d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
228e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
228f0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
22900 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e  an be used, then
22910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22920 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20  e will never.   
22930 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66   ** be created f
22940 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
22950 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
22960 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20  if( !zMaster && 
22970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22980 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
22990 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 6e 54  ze(pPager) && nT
229a0 72 75 6e 63 3d 3d 30 0a 20 20 20 20 20 20 26 26  runc==0.      &&
229b0 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69   (0==pPager->pDi
229c0 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  rty || 0==pPager
229d0 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79  ->pDirty->pDirty
229e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
229f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
22a00 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
22a10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
22a20 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
22a30 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
22a40 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
22a50 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
22a60 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
22a70 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
22a80 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
22a90 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
22aa0 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
22ab0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
22ac0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
22ad0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
22ae0 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
22af0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
22b00 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
22b10 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
22b20 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
22b30 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
22b40 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
22b50 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
22b60 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
22b70 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
22b80 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
22b90 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
22ba0 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
22bb0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
22bc0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
22bd0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
22be0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
22bf0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
22c00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22c10 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
22c20 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
22c30 0a 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64  .    }else .#end
22c40 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
22c50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
22c60 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
22c70 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
22c80 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
22c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
22ca0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
22cb0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
22cc0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
22cd0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
22ce0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
22cf0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
22d00 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
22d10 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
22d20 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
22d30 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
22d40 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
22d50 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
22d60 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
22d70 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
22d80 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
22d90 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
22da0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
22db0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
22dc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22dd0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
22de0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
22df0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22e00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
22e10 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
22e20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22e30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
22e40 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
22e50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
22e60 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
22e70 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
22e80 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
22e90 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
22ea0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
22eb0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
22ec0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
22ed0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
22ee0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
22ef0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
22f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
22f10 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
22f20 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
22f30 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
22f40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
22f50 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
22f60 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
22f70 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
22f80 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
22f90 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
22fa0 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
22fb0 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
22fc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22fd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
22fe0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
22ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23010 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
23020 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23030 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23040 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ite(pPg);.      
23050 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
23060 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
23070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
23080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
23090 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
230a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
230b0 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
230c0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
230d0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
230e0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
230f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
23100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
23110 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
23120 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
23130 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
23140 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
23150 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
23160 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66   sync_exit;..#if
23170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23180 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
23190 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
231a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
231b0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
231c0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
231d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
231e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
231f0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
23200 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
23210 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
23220 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
23230 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
23240 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
23250 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
23260 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
23270 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
23280 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
23290 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
232a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
232b0 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67  c_exit;.    pPag
232c0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
232d0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
232e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
232f0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
23300 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
23310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23320 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
23330 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
23340 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
23350 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
23360 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
23370 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ))..    pPager->
23380 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
23390 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NCED;.  }else if
233a0 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e  ( MEMDB && nTrun
233b0 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c!=0 ){.    rc =
233c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
233d0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
233e0 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63  runc);.  }..sync
233f0 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d  _exit:.  if( rc=
23400 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
23410 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  OCKED ){.    /* 
23420 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
23430 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61  ecounter() may a
23440 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
23450 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20   an exclusive.  
23460 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69     * lock to spi
23470 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ll the cache and
23480 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c   return IOERR_BL
23490 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65  OCKED. But since
234a0 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69   .     * there i
234b0 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20  s no chance the 
234c0 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69  cache is inconsi
234d0 73 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20  stent, it's.    
234e0 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74   * better to ret
234f0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
23500 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  .     */.    rc 
23510 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
23520 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
23530 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
23540 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
23550 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
23560 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
23570 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
23580 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
23590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
235a0 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
235b0 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
235c0 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
235d0 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
235e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
235f0 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
23600 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
23610 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
23620 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
23630 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
23640 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
23650 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
23660 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
23670 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
23680 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
23690 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
236a0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
236b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
236c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
236d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
236e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
236f0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
23700 72 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  r);.  PAGERTRACE
23710 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
23720 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23730 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
23740 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
23750 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
23760 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
23770 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
23780 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
23790 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
237a0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
237b0 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61  ger);.      clea
237c0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
237d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
237e0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
237f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
23800 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
23810 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
23820 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
23830 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
23840 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
23850 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
23860 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
23870 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
23880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
23890 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  rty = 0;.#ifndef
238a0 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
238b0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
238c0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
238d0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
238e0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
238f0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
23900 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
23910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
23920 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
23930 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
23940 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
23950 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
23960 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
23970 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
23980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
23990 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
239a0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
239b0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
239c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
239d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
239e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
239f0 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69  n || !pPager->di
23a00 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73  rtyCache );.  as
23a10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
23a20 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
23a30 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69  D || !pPager->di
23a40 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63  rtyCache );.  rc
23a50 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
23a60 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
23a70 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
23a80 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
23a90 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
23aa0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
23ab0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
23ac0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
23ad0 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
23ae0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
23af0 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
23b00 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
23b10 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
23b20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
23b30 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
23b40 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
23b50 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
23b60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
23b70 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
23b80 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
23b90 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
23ba0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
23bb0 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
23bc0 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
23bd0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
23be0 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
23bf0 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
23c00 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
23c10 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
23c20 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
23c30 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
23c40 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
23c50 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
23c60 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
23c70 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
23c80 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
23c90 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
23ca0 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
23cb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23cc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23cd0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
23ce0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23cf0 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54  int rc;.  PAGERT
23d00 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
23d10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
23d20 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
23d30 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
23d40 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
23d50 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
23d60 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
23d70 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
23d80 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
23d90 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
23da0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
23db0 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
23dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
23dd0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
23de0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
23df0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
23e00 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
23e10 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
23e20 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
23e30 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
23e40 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
23e50 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
23e60 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
23e70 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
23e80 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
23e90 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
23ea0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
23eb0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
23ec0 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
23ed0 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
23ee0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
23ef0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f   PAGERTRACE3("RO
23f00 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
23f10 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
23f20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
23f30 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
23f40 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
23f50 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
23f60 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
23f70 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
23f80 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
23f90 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
23fa0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
23fb0 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
23fc0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
23fd0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
23fe0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
23ff0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
24000 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
24010 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
24020 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
24030 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
24040 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
24050 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70  ->xReiniter(p, p
24060 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
24070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24080 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
24090 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
240a0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
240b0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
240c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
240d0 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65  DbSize;.    page
240e0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
240f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
24100 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
24110 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
24120 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
24130 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
24140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
24150 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
24160 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70  Pager);.  if( !p
24170 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
24180 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
24190 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
241a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
241b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
241c0 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
241d0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
241e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
241f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
24200 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
24210 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
24220 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
24230 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
24240 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
24250 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24260 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
24270 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
24280 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
24290 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  );.    return pP
242a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
242b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
242c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
242d0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
242e0 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
242f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
24300 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72  Pager, 0);.    r
24310 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
24320 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
24330 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
24340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24350 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
24360 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
24370 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
24380 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
24390 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72    }.  /* pager_r
243a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f  eset(pPager); */
243b0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
243c0 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
243d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
243e0 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
243f0 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
24400 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
24410 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
24420 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
24430 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
24440 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
24450 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
24460 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
24470 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
24480 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
24490 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
244a0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
244b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
244c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
244d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
244e0 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
244f0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
24500 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
24510 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
24520 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
24530 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
24540 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
24550 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
24560 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
24570 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
24580 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
24590 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
245a0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
245b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
245c0 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
245d0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
245e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
245f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
24600 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
24610 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
24620 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
24630 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
24640 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
24650 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
24660 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
24670 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
24680 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
24690 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
246a0 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
246b0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
246c0 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
246d0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
246e0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
246f0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
24700 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
24710 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
24720 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
24730 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
24740 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
24750 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
24760 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
24770 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
24780 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
24790 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
247a0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
247b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
247c0 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
247d0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
247e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
247f0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
24800 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
24810 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
24820 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
24830 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
24840 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
24850 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
24860 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
24870 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
24880 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
24890 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
248a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
248b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
248c0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
248d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
248e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
248f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
24900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24910 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
24920 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
24930 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24940 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
24950 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
24960 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
24970 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
24980 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
24990 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
249a0 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
249b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
249c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
249d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
249e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
249f0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
24a00 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
24a10 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
24a20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
24a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24a40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24a50 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
24a60 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
24a70 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
24a80 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
24a90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50  e3MallocZero( pP
24aa0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
24ab0 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74   1 );.  pagerEnt
24ac0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
24ad0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
24ae0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
24af0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
24b00 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
24b10 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
24b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24b30 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
24b40 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
24b50 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
24b60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
24b70 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
24b80 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
24b90 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
24ba0 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
24bb0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
24bc0 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
24bd0 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
24be0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
24bf0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
24c00 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
24c10 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
24c20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
24c30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
24c40 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
24c50 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
24c60 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
24c70 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
24c80 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
24c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24ca0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
24cb0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
24cc0 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 69  >stfd, 0);.    i
24cd0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
24ce0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
24cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
24d00 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
24d10 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
24d20 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
24d30 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
24d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24d50 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
24d60 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
24d70 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
24d80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24d90 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
24da0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
24db0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
24dc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24dd0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
24de0 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
24df0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
24e00 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
24e10 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
24e20 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
24e30 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  n(pPager);.  pag
24e40 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
24e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24e60 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
24e70 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
24e80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
24e90 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  mtCommit(Pager *
24ea0 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72  pPager){.  pager
24eb0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
24ec0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
24ed0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
24ee0 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
24ef0 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
24f00 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
24f10 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
24f20 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
24f30 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
24f40 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
24f50 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
24f60 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
24f70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50  sqlite3_free( pP
24f80 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
24f90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
24fa0 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
24fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
24fc0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
24fd0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
24fe0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  xt){.        PgH
24ff0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
25000 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
25010 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
25020 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73      pNext = pHis
25030 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  t->pNextStmt;.  
25040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
25050 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  ist->inStmt );. 
25060 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e         pHist->in
25070 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
25080 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
25090 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
250a0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
250b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
250c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
250d0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
250e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
250f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
25100 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
25110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
25120 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
25130 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
25140 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
25150 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
25160 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
25170 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
25180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25190 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
251a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
251b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
251c0 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  tmtRollback(Page
251d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
251e0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
251f0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
25200 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
25210 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52  Use ){.    PAGER
25220 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
25230 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
25240 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
25250 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
25260 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
25270 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  ;.      PgHistor
25280 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
25290 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
252a0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
252b0 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
252c0 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  ){.        pHist
252d0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
252e0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
252f0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
25300 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
25310 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
25320 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
25330 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
25340 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
25350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25360 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
25370 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
25380 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
25390 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
253a0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
253b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
253c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
253d0 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
253e0 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
253f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
25400 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
25410 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
25420 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
25430 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
25440 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
25450 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67  rStmtCommit(pPag
25460 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
25470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25480 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
25490 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
254a0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
254b0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
254c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
254d0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
254e0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
254f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
25500 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
25510 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
25520 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25530 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
25540 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
25550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25560 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
25570 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
25580 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
25590 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
255a0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
255b0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
255c0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
255d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
255e0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
255f0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
25600 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
25610 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
25620 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
25630 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25640 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
25650 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
25660 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
25670 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
25680 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
25690 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
256a0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
256b0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
256c0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
256d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
256e0 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
256f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
25700 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
25710 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
25720 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
25730 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
25740 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
25750 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
25760 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
25770 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
25780 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
25790 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
257a0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
257b0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
257c0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
257d0 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
257e0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
257f0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
25800 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
25810 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25820 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
25830 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
25840 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
25850 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  the file. .**.**
25860 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
25870 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
25880 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
25890 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
258a0 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
258b0 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
258c0 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
258d0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
258e0 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
258f0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
25900 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  us located at pg
25910 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
25920 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
25930 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
25940 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
25950 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
25960 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
25970 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
25980 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
25990 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
259a0 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
259b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
259c0 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
259d0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
259e0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
259f0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
25a00 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
25a10 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
25a20 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
25a30 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
25a40 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
25a50 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
25a60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
25a70 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
25a80 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
25a90 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
25aa0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
25ab0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
25ac0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
25ad0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
25ae0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
25af0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
25b00 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
25b10 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
25b20 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
25b30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25b40 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
25b50 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
25b60 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
25b70 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
25b80 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ld;  /* The page
25b90 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
25ba0 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a  en. */.  int h;.
25bb0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
25bc0 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65  gno = 0;..  page
25bd0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
25be0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
25bf0 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
25c00 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
25c10 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
25c20 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
25c30 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
25c40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
25c50 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
25c60 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
25c70 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
25c80 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
25c90 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
25ca0 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
25cb0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
25cc0 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  );.  if( pPg->ne
25cd0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
25ce0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
25cf0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
25d00 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
25d10 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e  al || (int)pgno>
25d20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25d30 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
25d40 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
25d50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25d60 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
25d70 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
25d80 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
25d90 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
25da0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
25db0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
25dc0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
25dd0 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
25de0 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
25df0 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
25e00 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
25e10 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
25e20 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
25e30 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
25e40 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
25e50 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
25e60 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
25e70 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
25e80 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
25e90 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
25ea0 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
25eb0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
25ec0 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  0;.  pPgOld = pa
25ed0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
25ee0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
25ef0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
25f00 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
25f10 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
25f20 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
25f30 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
25f40 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
25f50 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  ld);.    pPg->ne
25f60 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d  edSync = pPgOld-
25f70 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c  >needSync;.  }el
25f80 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  se{.    pPg->nee
25f90 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  dSync = 0;.  }. 
25fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
25fb0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
25fc0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
25fd0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
25fe0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
25ff0 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f    (pPager->aInJo
26000 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
26010 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
26020 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
26030 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
26040 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
26050 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
26060 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
26070 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
26080 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   );.  }..  /* Ch
26090 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
260a0 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
260b0 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
260c0 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
260d0 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
260e0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
260f0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
26100 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
26110 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
26120 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
26130 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
26140 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
26150 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
26160 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
26170 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
26180 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
26190 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
261a0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
261b0 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
261c0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
261d0 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
261e0 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
261f0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
26200 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
26210 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
26220 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
26230 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
26240 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
26250 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
26260 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
26270 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
26280 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
26290 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
262a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
262b0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
262c0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
262d0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
262e0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
262f0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
26300 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
26310 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
26320 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
26330 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
26340 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
26350 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
26360 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
26370 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
26380 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
26390 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
263a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
263b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
263c0 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
263d0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
263e0 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
263f0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
26400 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
26410 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
26420 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
26430 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
26440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26450 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
26460 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
26470 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
26480 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
26490 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
264a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
264b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
264c0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
264d0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
264e0 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
264f0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
26500 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
26510 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
26520 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
26530 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
26540 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c  );.  }..  pagerL
26550 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
26560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26570 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
26580 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26590 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
265a0 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
265b0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
265c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
265d0 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
265e0 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  {.  return PGHDR
265f0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
26600 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
26610 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26620 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
26630 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
26640 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
26650 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
26660 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
26670 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
26680 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
26690 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
266a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
266b0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
266c0 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48  turn (pPager?PGH
266d0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
266e0 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a   pPager):0);.}..
266f0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
26700 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
26710 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
26720 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
26730 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
26740 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26750 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
26760 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
26770 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
26780 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
26790 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
267a0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
267b0 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
267c0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
267d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
267e0 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
267f0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
26800 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
26810 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
26820 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
26830 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26840 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
26850 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
26860 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
26870 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
26880 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
26890 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
268a0 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
268b0 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
268c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
268d0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
268e0 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
268f0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
26900 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
26910 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
26920 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
26930 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
26940 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
26950 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
26960 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
26970 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
26980 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26990 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
269a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
269b0 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
269c0 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
269d0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
269e0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
269f0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
26a00 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
26a10 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
26a20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
26a30 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ode;.}..#if defi
26a40 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
26a50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
26a60 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
26a70 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
26a80 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
26a90 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
26aa0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
26ab0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
26ac0 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
26ad0 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
26ae0 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
26af0 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
26b00 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
26b10 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
26b20 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61  ite3PagerLocksta
26b30 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
26b40 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
26b50 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
26b60 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
26b70 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
26b80 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
26b90 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
26ba0 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
26bb0 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
26bc0 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
26bd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
26be0 72 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  rRefdump(Pager *
26bf0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
26c00 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
26c10 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
26c20 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
26c30 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
26c40 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
26c50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
26c60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26c70 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
26c80 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
26c90 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
26ca0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
26cb0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
26cc0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
26cd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26ce0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.