/ Hex Artifact Content
Login

Artifact f9830adfd3752c860a4024da5b871df5af4ed8a4:


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 38  : pager.c,v 1.38
0350: 30 20 32 30 30 37 2f 30 38 2f 32 39 20 31 32 3a  0 2007/08/29 12:
0360: 33 31 3a 32 37 20 64 61 6e 69 65 6c 6b 31 39 37  31:27 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 74 79 70 65 64 65 66  +7)&~7)..typedef
1600: 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67   struct PgHdr Pg
1610: 48 64 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  Hdr;../*.** Each
1620: 20 70 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c   pager stores al
1630: 6c 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65  l currently unre
1640: 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 69  ferenced pages i
1650: 6e 20 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a  n a list sorted.
1660: 2a 2a 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65  ** in least-rece
1670: 6e 74 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20  ntly-used (LRU) 
1680: 6f 72 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20  order (i.e. the 
1690: 66 69 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68  first item on th
16a0: 65 20 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e  e list has .** n
16b0: 6f 74 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ot been referenc
16c0: 65 64 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d  ed in a long tim
16d0: 65 2c 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d  e, the last item
16e0: 20 68 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74   has been recent
16f0: 6c 79 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20  ly.** used). An 
1700: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1710: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 69 6e   structure is in
1720: 63 6c 75 64 65 64 20 61 73 20 70 61 72 74 20 6f  cluded as part o
1730: 66 20 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20  f each.** pager 
1740: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
1750: 69 73 20 70 75 72 70 6f 73 65 20 28 76 61 72 69  is purpose (vari
1760: 61 62 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e  able Pager.lru).
1770: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
1780: 6c 6c 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  lly, if memory-m
1790: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
17a0: 62 6c 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65  bled, all unrefe
17b0: 72 65 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a  renced pages .**
17c0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
17d0: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
17e0: 20 28 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c   (global variabl
17f0: 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  e sqlite3LruPage
1800: 4c 69 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  List)..**.** In 
1810: 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
1820: 50 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69  PagerLruList.pFi
1830: 72 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62  rstSynced variab
1840: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  le points to.** 
1850: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
1860: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1870: 69 6e 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f  ing list that do
1880: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1890: 6e 0a 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65  n.** fsync() ope
18a0: 72 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74  ration before it
18b0: 27 73 20 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65  's memory can be
18c0: 20 72 65 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e   reclaimed. If n
18d0: 6f 20 73 75 63 68 0a 2a 2a 20 70 61 67 65 20 65  o such.** page e
18e0: 78 69 73 74 73 2c 20 50 61 67 65 72 4c 72 75 4c  xists, PagerLruL
18f0: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1900: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1910: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1920: 63 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ct PagerLruList 
1930: 50 61 67 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74  PagerLruList;.st
1940: 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69 73  ruct PagerLruLis
1950: 74 20 7b 0a 20 20 50 67 48 64 72 20 2a 70 46 69  t {.  PgHdr *pFi
1960: 72 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rst;         /* 
1970: 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 4c 52  First page in LR
1980: 55 20 6c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64  U list */.  PgHd
1990: 72 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  r *pLast;       
19a0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
19b0: 69 6e 20 4c 52 55 20 6c 69 73 74 20 28 74 68 65  in LRU list (the
19c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 75   most recently u
19d0: 73 65 64 29 20 2a 2f 0a 20 20 50 67 48 64 72 20  sed) */.  PgHdr 
19e0: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
19f0: 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 69   /* First page i
1a00: 6e 20 6c 69 73 74 20 77 69 74 68 20 50 67 48 64  n list with PgHd
1a10: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
1a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
1a30: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1a40: 72 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  re contains the 
1a50: 6e 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f 75  next and previou
1a60: 73 20 70 6f 69 6e 74 65 72 73 20 75 73 65 64 0a  s pointers used.
1a70: 2a 2a 20 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48  ** to link a PgH
1a80: 64 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  dr structure int
1a90: 6f 20 61 20 50 61 67 65 72 4c 72 75 4c 69 73 74  o a PagerLruList
1aa0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a   linked list. .*
1ab0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1ac0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61   PagerLruLink Pa
1ad0: 67 65 72 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75  gerLruLink;.stru
1ae0: 63 74 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  ct PagerLruLink 
1af0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  {.  PgHdr *pNext
1b00: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 72 65 76  ;.  PgHdr *pPrev
1b10: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.};../*.** Each
1b20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1b30: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1b40: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1b50: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1b60: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1b70: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1b80: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1b90: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
1ba0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
1bb0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
1bc0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
1bd0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
1be0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
1bf0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1c00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c10: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1c20: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1c30: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1c40: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1c50: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1c60: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1c70: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1c80: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1c90: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1ca0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1cb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1cc0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1cd0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
1ce0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
1cf0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1d00: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1d10: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1d20: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1d30: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1d40: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1d50: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1d60: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1d70: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1d80: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1d90: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1da0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1db0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1dc0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1dd0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
1de0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
1df0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1e00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1e10: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1e20: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1e30: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1e40: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1e50: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1e60: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1e70: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1e80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1e90: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1ea0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65  e file..**.** De
1eb0: 74 61 69 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61  tails of importa
1ec0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 65 6c 65  nt structure ele
1ed0: 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65  ments:.**.** nee
1ee0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20  dSync.**.**     
1ef0: 49 66 20 74 68 69 73 20 69 73 20 74 72 75 65 2c  If this is true,
1f00: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
1f10: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
1f20: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 67  to write the pag
1f30: 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74  e.**     content
1f40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f50: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
1f60: 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65  ginal content ne
1f70: 65 64 65 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20  eded.**     for 
1f80: 72 6f 6c 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74  rollback has not
1f90: 20 62 79 20 73 79 6e 63 65 64 20 74 6f 20 74 68   by synced to th
1fa0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
1fb0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20  journal..**     
1fc0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  The original con
1fd0: 74 65 6e 74 20 6d 61 79 20 68 61 76 65 20 62 65  tent may have be
1fe0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1ff0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2000: 61 6c 0a 2a 2a 20 20 20 20 20 62 75 74 20 69 74  al.**     but it
2010: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
2020: 6e 20 73 79 6e 63 65 64 2e 20 20 53 6f 20 77 65  n synced.  So we
2030: 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
2040: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2050: 20 20 20 20 20 66 69 6c 65 20 62 65 63 61 75 73       file becaus
2060: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
2070: 6d 69 67 68 74 20 63 61 75 73 65 20 74 68 65 20  might cause the 
2080: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
2090: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20a0: 74 6f 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  to never reach t
20b0: 68 65 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  he disk.  It is 
20c0: 61 73 20 69 66 20 74 68 65 20 77 72 69 74 65 20  as if the write 
20d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
20e0: 69 6c 65 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20  ile.**     does 
20f0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 20  not occur until 
2100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2110: 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20   is synced..**  
2120: 20 20 20 0a 2a 2a 20 20 20 20 20 54 68 69 73 20     .**     This 
2130: 66 6c 61 67 20 69 73 20 66 61 6c 73 65 20 69 66  flag is false if
2140: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
2150: 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2160: 73 20 77 68 61 74 0a 2a 2a 20 20 20 20 20 63 75  s what.**     cu
2170: 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 69  rrently exists i
2180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2190: 69 6c 65 2e 20 20 54 68 65 20 6e 65 65 64 53 79  ile.  The needSy
21a0: 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a  nc flag is also.
21b0: 2a 2a 20 20 20 20 20 66 61 6c 73 65 20 69 66 20  **     false if 
21c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
21d0: 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  tent has been wr
21e0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6d 61 69  itten to the mai
21f0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20  n rollback.**   
2200: 20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79    journal and sy
2210: 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 70 61  nced.  If the pa
2220: 67 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  ge represents a 
2230: 6e 65 77 20 70 61 67 65 20 74 68 61 74 20 68 61  new page that ha
2240: 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 61 64  s.**     been ad
2250: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
2260: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2270: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
2280: 65 6e 74 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73  ent.**     trans
2290: 61 63 74 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64  action, the need
22a0: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75  Sync flag is tru
22b0: 65 20 75 6e 74 69 6c 20 74 68 65 20 6f 72 69 67  e until the orig
22c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a  inal database.**
22d0: 20 20 20 20 20 73 69 7a 65 20 69 6e 20 74 68 65       size in the
22e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
22f0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2300: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69  to disk..**.** i
2310: 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20  nJournal.**.**  
2320: 20 20 20 54 68 69 73 20 69 73 20 74 72 75 65 20     This is true 
2330: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
2340: 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 77 72  page has been wr
2350: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
2360: 61 69 6e 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  ain.**     rollb
2370: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
2380: 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  is is always fal
2390: 73 65 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73  se for new pages
23a0: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20   added to.**    
23b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 75  database file du
23d0: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
23e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
23f0: 20 20 20 20 20 41 6e 64 20 74 68 69 73 20 66 6c       And this fl
2400: 61 67 20 73 61 79 73 20 6e 6f 74 68 69 6e 67 20  ag says nothing 
2410: 61 62 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72  about whether or
2420: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
2430: 0a 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e  .**     has been
2440: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2450: 20 20 46 6f 72 20 70 61 67 65 73 20 74 68 61 74    For pages that
2460: 20 61 72 65 20 69 6e 20 74 68 65 20 6f 72 69 67   are in the orig
2470: 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61  inal.**     data
2480: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66  base file, the f
2490: 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
24a0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
24b0: 73 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a  s be true:.**.**
24c0: 20 20 20 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c         inJournal
24d0: 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
24e0: 6f 75 72 6e 61 6c 5b 28 70 67 6e 6f 2d 31 29 2f  ournal[(pgno-1)/
24f0: 38 5d 20 26 20 28 31 3c 3c 28 28 70 67 6e 6f 2d  8] & (1<<((pgno-
2500: 31 29 25 38 29 29 21 3d 30 0a 2a 2a 0a 2a 2a 20  1)%8))!=0.**.** 
2510: 20 20 20 20 54 68 65 20 70 50 61 67 65 72 2d 3e      The pPager->
2520: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20 61 72 72  aInJournal[] arr
2530: 61 79 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  ay is only valid
2540: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
2550: 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 6f  l.**     pages o
2560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
2570: 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74 68  not new pages th
2580: 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  at are added to 
2590: 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20 6f  the end.**     o
25a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
25b0: 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68 65  so obviously the
25c0: 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69 6f   above expressio
25d0: 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 20  n cannot be.**  
25e0: 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65 77     valid for new
25f0: 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65 77   pages.  For new
2600: 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61 6c   pages inJournal
2610: 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2a   is always 0..**
2620: 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a 20  .** dirty.**.** 
2630: 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20 74      When true, t
2640: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
2650: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2660: 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 0a  e page has been.
2670: 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64 20  **     modified 
2680: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
2690: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
26a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26b0: 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61 6c  e..**     If fal
26c0: 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  se, it means tha
26d0: 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  t either the con
26e0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26f0: 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68 61   is.**     uncha
2700: 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68 65  nged or else the
2710: 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69 6d   content is unim
2720: 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20 64  portant and we d
2730: 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61 72  o not.**     car
2740: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
2750: 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65 64   it is preserved
2760: 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52 6f  ..**.** alwaysRo
2770: 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 20  llback.**.**    
2780: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2790: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
27a0: 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
27b0: 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  API should be.**
27c0: 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f 72       ignored for
27d0: 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68 65   this page.  The
27e0: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
27f0: 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f 20  API attempts to 
2800: 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  say.**     that 
2810: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2820: 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  he page on disk 
2830: 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 28  is unimportant (
2840: 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20 20  it is an.**     
2850: 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20 74  unused page on t
2860: 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f 20  he freelist) so 
2870: 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65 63  that it is unnec
2880: 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20 20  essary to .**   
2890: 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67    rollback chang
28a0: 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  es to this page 
28b0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e 74  because the cont
28c0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 0a  ent of the page.
28d0: 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e 67  **     can chang
28e0: 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  e without changi
28f0: 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ng the meaning o
2900: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2910: 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c 61   This.**     fla
2920: 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  g overrides any 
2930: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 61  DontRollback() a
2940: 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66 6c  ttempt.  This fl
2950: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20  ag is set.**    
2960: 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61   when a page tha
2970: 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  t originally con
2980: 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61 74  tained valid dat
2990: 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  a is added to.**
29a0: 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69 73       the freelis
29b0: 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68 65  t.  Later in the
29c0: 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
29d0: 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69 67  n, this page mig
29e0: 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75 6c  ht.**     be pul
29f0: 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  led from the fre
2a00: 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  elist and reused
2a10: 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 64   for something d
2a20: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20 20  ifferent.**     
2a30: 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69 6e  and at that poin
2a40: 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  t the DontRollba
2a50: 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62 65  ck() API will be
2a60: 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65 0a   called because.
2a70: 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61 6b  **     pages tak
2a80: 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  en from the free
2a90: 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65 64  list do not need
2aa0: 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65 64   to be protected
2ab0: 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   by.**     the r
2ac0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2ad0: 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67 20    But this flag 
2ae0: 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70 61  says that the pa
2af0: 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e 6f  ge was.**     no
2b00: 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 72  t originally par
2b10: 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  t of the freelis
2b20: 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74 69  t so that it sti
2b30: 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20 20  ll needs to.**  
2b40: 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63     be rolled bac
2b50: 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61 6e  k in spite of an
2b60: 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f 6e  y subsequent Don
2b70: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
2b80: 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65 61  s..**.** needRea
2b90: 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69  d .**.**     Thi
2ba0: 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77 68  s flag means (wh
2bb0: 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74 68  en true) that th
2bc0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2bd0: 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20 20   page has.**    
2be0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c 6f   not yet been lo
2bf0: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e 20  aded from disk. 
2c00: 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   The in-memory c
2c10: 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a 2a  ontent is just.*
2c20: 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20 20  *     garbage.  
2c30: 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a 65  (Actually, we ze
2c40: 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c 20  ro the content, 
2c50: 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20 6e  but you should n
2c60: 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20 61  ot.**     make a
2c70: 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ny assumptions a
2c80: 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
2c90: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29 20   nevertheless.) 
2ca0: 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 63   If the.**     c
2cb0: 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
2cc0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
2cd0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  it should be rea
2ce0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20  d from the.**   
2cf0: 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62    original datab
2d00: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2d10: 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61  uct PgHdr {.  Pa
2d20: 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d40: 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69  The pager to whi
2d50: 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c  ch this page bel
2d60: 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ongs */.  Pgno p
2d70: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
2d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d90: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
2da0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
2db0: 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c  gHdr *pNextHash,
2dc0: 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a   *pPrevHash;  /*
2dd0: 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   Hash collision 
2de0: 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e  chain for PgHdr.
2df0: 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72 4c  pgno */.  PagerL
2e00: 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20 20  ruLink free;    
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2e20: 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66 72   and previous fr
2e30: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
2e40: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
2e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  ges */.  u8 inJo
2e80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2ea0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
2eb0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2ec0: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
2ef0: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
2f00: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
2f10: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
2f40: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
2f50: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
2f60: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f80: 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c  Disable DontRoll
2f90: 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20  back() for this 
2fa0: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  page */.  u8 nee
2fb0: 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  dRead;          
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2fd0: 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67 65   content if Page
2fe0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
2ff0: 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ed */.  short in
3000: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3020: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
3030: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
3040: 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65  r *pDirty, *pPre
3050: 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69  vDirty;    /* Di
3060: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  rty pages */.#if
3070: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3080: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3090: 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c 69  ENT.  PagerLruLi
30a0: 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20 20  nk gfree;       
30b0: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 6c       /* Global l
30c0: 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20 70  ist of nRef==0 p
30d0: 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ages */.#endif. 
30e0: 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20   u32 notUsed;   
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 2f 2a 20 42 75 66 66 65 72 20 73 70 61 63 65 20  /* Buffer space 
3110: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3120: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
3130: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
3140: 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  dif.  /* pPager-
3150: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3160: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
3170: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
3180: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
3190: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
31a0: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
31b0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
31c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61  .};../*.** For a
31d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  n in-memory only
31e0: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20   database, some 
31f0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
3200: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62  n is recorded ab
3210: 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65  out.** each page
3220: 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73   so that changes
3230: 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
3240: 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66  ack.  (Journal f
3250: 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  iles are not.** 
3260: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
3270: 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20  ry databases.)  
3280: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  The following in
3290: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64  formation is add
32a0: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64  ed to.** the end
32b0: 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20   of every EXTRA 
32c0: 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d  block for in-mem
32d0: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ory databases..*
32e0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d  *.** This inform
32f0: 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ation could have
3300: 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65   been added dire
3310: 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64  ctly to the PgHd
3320: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  r structure..** 
3330: 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c  But then it woul
3340: 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74  d take up an ext
3350: 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74  ra 8 bytes of st
3360: 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50  orage on every P
3370: 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72  gHdr.** even for
3380: 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61   disk-based data
3390: 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e  bases.  Splittin
33a0: 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38  g it out saves 8
33b0: 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a   bytes.  This.**
33c0: 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e   is only a savin
33d0: 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74  gs of 0.8% but t
33e0: 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73  hose percentages
33f0: 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65   add up..*/.type
3400: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73  def struct PgHis
3410: 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a  tory PgHistory;.
3420: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
3430: 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20   {.  u8 *pOrig; 
3440: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
3450: 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74  page text.  Rest
3460: 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61  ore to this on a
3470: 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a   full rollback *
3480: 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20  /.  u8 *pStmt;  
3490: 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74     /* Text as it
34a0: 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69   was at the begi
34b0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
34c0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
34d0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
34e0: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
34f0: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
3500: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
3510: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
3520: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
3550: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3560: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  journal */.};../
3570: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
3580: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
3590: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
35a0: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
35b0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
35c0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
35d0: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
35e0: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
35f0: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
3600: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
3610: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
3620: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
3630: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
3640: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
3650: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
3660: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
3670: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3680: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
3690: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
36a0: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
36b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
36c0: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
36d0: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
36e0: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
36f0: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
3700: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
3710: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
3720: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
3730: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
3740: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
3750: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
3760: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
3770: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
3780: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
3790: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
37a0: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
37b0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
37c0: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
37d0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
37e0: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
37f0: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
3800: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
3810: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
3820: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
3830: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
3840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
3850: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3860: 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65  e..**.** Pager.e
3870: 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65  rrCode may be se
3880: 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52  t to SQLITE_IOER
3890: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
38a0: 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49  T, or.** or SQLI
38b0: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
38c0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
38d0: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
38e0: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
38f0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
3900: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
3910: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
3920: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
3930: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
3940: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
3950: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
3960: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
3970: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
3980: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
3990: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
39a0: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
39b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
39c0: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
39d0: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
39e0: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
39f0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
3a00: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
3a10: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
3a20: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
3a30: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
3a40: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
3a50: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
3a60: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
3a70: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
3a80: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
3a90: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
3aa0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3ab0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
3ac0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
3ad0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
3ae0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
3af0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
3b00: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
3b10: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
3b20: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
3b30: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3b40: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
3b50: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
3b60: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
3b70: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b90: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
3ba0: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
3bb0: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
3bc0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3bd0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3be0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3bf0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
3c00: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
3c10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3c20: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
3c30: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
3c40: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
3c50: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
3c60: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
3c70: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
3c80: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
3c90: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
3ca0: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cc0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
3cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
3ce0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
3cf0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3d00: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
3d10: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
3d20: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
3d30: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
3d40: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
3d50: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
3d60: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
3d70: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
3d80: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
3d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
3da0: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
3db0: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
3dc0: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
3dd0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3de0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3df0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3e00: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3e10: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3e20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3e30: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3e40: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
3e50: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
3e60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3e70: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
3e80: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
3e90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
3ea0: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
3eb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ec0: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
3ed0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
3ee0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
3ef0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
3f00: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
3f10: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
3f20: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
3f30: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
3f40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
3f50: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
3f60: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
3f70: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f90: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3fa0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3fb0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3fc0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3fd0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3fe0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3ff0: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
4000: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65   cache */.  u8 e
4010: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
4020: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
4030: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
4040: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
4050: 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e  IVE */.  u8 chan
4060: 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20  geCountDone;    
4070: 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65       /* Set afte
4080: 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  r incrementing t
4090: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
40a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  r */.  int errCo
40b0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
40c0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
40d0: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
40e0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
40f0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4100: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4110: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4120: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
4130: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
4140: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
4150: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
4160: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
4170: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
4180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4190: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
41a0: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
41b0: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
41c0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
41d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
41e0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
41f0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4200: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
4210: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
4220: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
4230: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
4240: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
4250: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
4260: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
4290: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
42a0: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
42d0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
42e0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
42f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4310: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
4320: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
4330: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
4340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
4350: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
4360: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
4370: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4390: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
43a0: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
43b0: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
43c0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43e0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
43f0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4400: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
4410: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
4420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4430: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
4440: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
4450: 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ase */.  u8 *aIn
4460: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
4470: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
4480: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
4490: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
44a0: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
44b0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
44c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
44d0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
44e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
44f0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4500: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4510: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
4520: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4530: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
4540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4550: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
4560: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4570: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4590: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
45a0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
45b0: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
45c0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
45d0: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
45e0: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
45f0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4600: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4610: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4620: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4630: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
4640: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4650: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
4660: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4670: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
4680: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
4690: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
46a0: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
46b0: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
46c0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
46d0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
46e0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
46f0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4700: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4710: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4720: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4730: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4740: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4750: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
4760: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
4770: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4780: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
4790: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
47a0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
47b0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
47c0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
47d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
47e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
47f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4800: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4810: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4820: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4830: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
4840: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4850: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
4860: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
4870: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
4880: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
4890: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
48a0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
48b0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
48c0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
48d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
48e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
48f0: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4900: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4910: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4920: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4930: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
4940: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
4950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4960: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
4970: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
4980: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
4990: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
49a0: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
49b0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
49c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
49d0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
49e0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
49f0: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a00: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a20: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a30: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4a40: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4a50: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4a60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a70: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4a80: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4a90: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4aa0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4ab0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4ac0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4ad0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4ae0: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4af0: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b00: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b10: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b20: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b30: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b50: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4b60: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4b70: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4b90: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4ba0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4bb0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4bc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4bd0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4be0: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c00: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c10: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c20: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c30: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4c50: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4c60: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4c70: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d  */.  int iInUseM
4c80: 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M;              
4c90: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4ca0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4cb0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73  M */.  int iInUs
4cc0: 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  eDB;            
4cd0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4ce0: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4cf0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d00: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d10: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d30: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4d40: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4d50: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4d60: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4d70: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4d80: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4d90: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4da0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4db0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4dc0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4dd0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4de0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4df0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4e00: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4e10: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4e20: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4e30: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4e40: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4e50: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4e60: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4e70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4e80: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4e90: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ea0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4eb0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4ec0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4ed0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4ee0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4ef0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4f00: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4f10: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f20: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4f30: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f40: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4f50: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69   to journal */.i
4f60: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f70: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20  _pgfree_count = 
4f80: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f90: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66  of cache pages f
4fa0: 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65  reed */.# define
4fb0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
4fc0: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
4fd0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
4fe0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4ff0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
5000: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5010: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f  the head of a do
5020: 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  uble-linked list
5030: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72  .** of all pager
5040: 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69  s that are eligi
5050: 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65  ble for page ste
5060: 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  aling by the.** 
5070: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
5080: 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61  memory() interfa
5090: 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  ce.  Access to t
50a0: 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70  his list is.** p
50b0: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
50c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
50d0: 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a  TIC_MEM2 mutex..
50e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
50f0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5100: 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63  ANAGEMENT.static
5110: 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50   Pager *sqlite3P
5120: 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74  agerList = 0;.st
5130: 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73  atic PagerLruLis
5140: 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  t sqlite3LruPage
5150: 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  List = {0, 0, 0}
5160: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5170: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
5180: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
5190: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
51a0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
51b0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
51c0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
51d0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
51e0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
51f0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
5200: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
5210: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5220: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
5230: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
5240: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
5250: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
5260: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
5270: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
5280: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
5290: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
52a0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
52b0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
52c0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
52d0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
52e0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
52f0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
5300: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
5310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
5320: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
5330: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
5340: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
5350: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
5360: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
5370: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
5380: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
5390: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
53a0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
53b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
53c0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
53d0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
53e0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
53f0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
5400: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
5410: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
5420: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
5430: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
5440: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
5450: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
5460: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
5470: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
5480: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
5490: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
54a0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
54b0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
54c0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
54d0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
54e0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
54f0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
5500: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
5510: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
5520: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
5530: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
5540: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
5550: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5560: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
5570: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
5580: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
5590: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
55a0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
55b0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
55c0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
55d0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
55e0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
55f0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
5600: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
5610: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
5620: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
5630: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
5640: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
5650: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
5660: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
5670: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
5680: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
5690: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
56a0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
56b0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
56c0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
56d0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
56e0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
56f0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
5700: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
5710: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
5720: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
5730: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
5740: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
5750: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
5760: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5770: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5780: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
5790: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
57a0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
57b0: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
57c0: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
57d0: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
57e0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
57f0: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
5800: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
5810: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
5820: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
5830: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
5840: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
5850: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
5860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5870: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
5880: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
5890: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
58a0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
58b0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
58c0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
58d0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
58e0: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
58f0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
5900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5910: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
5920: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
5930: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
5940: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
5950: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5960: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5970: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
5980: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
5990: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59a0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
59b0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
59c0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
59d0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
59e0: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
59f0: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
5a00: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
5a10: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
5a20: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5a30: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
5a40: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
5a50: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
5a60: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
5a70: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
5a80: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
5a90: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
5aa0: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
5ab0: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5ac0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
5ad0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
5ae0: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
5af0: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
5b00: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
5b10: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
5b20: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
5b30: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
5b40: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
5b50: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
5b60: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
5b70: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
5b80: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5b90: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
5ba0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5bb0: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
5bc0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5bd0: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
5be0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
5bf0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
5c00: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
5c10: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5c20: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
5c30: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
5c40: 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64  pagerEnter() and
5c50: 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f   pagerLeave() ro
5c60: 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61  utines acquire a
5c70: 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20  nd release.** a 
5c80: 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61  mutex on each pa
5c90: 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20  ger.  The mutex 
5ca0: 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a  is recursive..**
5cb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70  .** This is a sp
5cc0: 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  ecial-purpose mu
5cd0: 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72  tex.  It only pr
5ce0: 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78  ovides mutual ex
5cf0: 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  clusion.** betwe
5d00: 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64  en the Btree and
5d10: 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61   the Memory Mana
5d20: 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72  gement sqlite3_r
5d30: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a  elease_memory().
5d40: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  ** function.  It
5d50: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e   does not preven
5d60: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d70: 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20  two Btrees from 
5d80: 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65  accessing.** the
5d90: 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74   same pager at t
5da0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f  he same time.  O
5db0: 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72  ther general-pur
5dc0: 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a  pose mutexes in.
5dd0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
5de0: 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  er handle that c
5df0: 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  hore..*/.#ifdef 
5e00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5e10: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5e20: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5e30: 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a  gerEnter(Pager *
5e40: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
5e50: 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  eDB++;.    if( p
5e60: 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d  ->iInUseMM && p-
5e70: 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a  >iInUseDB==1 ){.
5e80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5e90: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20  tex *mutex;.    
5ea0: 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
5eb0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5ec0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5ed0: 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70  C_MEM2);.      p
5ee0: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
5ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f00: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
5f10: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73  ;.      p->iInUs
5f20: 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eDB = 1;.      s
5f30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f40: 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ve(mutex);.    }
5f50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f60: 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20  iInUseMM==0 );. 
5f70: 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
5f80: 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65   pagerLeave(Page
5f90: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5fa0: 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73  nUseDB--;.    as
5fb0: 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44  sert( p->iInUseD
5fc0: 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  B>=0 );.  }.#els
5fd0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
5fe0: 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e  Enter(X).# defin
5ff0: 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a  e pagerLeave(X).
6000: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
6010: 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63  able reference c
6020: 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66  ount tracking (f
6030: 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68 65  or debugging) he
6040: 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re:.*/.#ifdef SQ
6050: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
6060: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
6070: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
6080: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
6090: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
60a0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
60b0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
60c0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
60d0: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
60e0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
60f0: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
6100: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
6110: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33  addr=%p nRef=%-3
6120: 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
6130: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
6140: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
6150: 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61   p->nRef, p->pPa
6160: 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  ger->nRef.    );
6170: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
6180: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
6190: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
61a0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
61b0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
61c0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
61d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
61e0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
61f0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20  ./*.** Add page 
6200: 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  pPg to the end o
6210: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
6220: 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72  t managed by str
6230: 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20  ucture.** pList 
6240: 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65  (pPg becomes the
6250: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
6260: 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f  he list - the mo
6270: 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20  st recently .** 
6280: 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20  used). Argument 
6290: 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69  pLink should poi
62a0: 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67  nt to either pPg
62b0: 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67  ->free or pPg->g
62c0: 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  free,.** dependi
62d0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50  ng on whether pP
62e0: 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64  g is being added
62f0: 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70   to the pager-sp
6300: 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f  ecific or.** glo
6310: 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f  bal LRU list..*/
6320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73  .static void lis
6330: 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73  tAdd(PagerLruLis
6340: 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c  t *pList, PagerL
6350: 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50  ruLink *pLink, P
6360: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c  gHdr *pPg){.  pL
6370: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ink->pNext = 0;.
6380: 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d    pLink->pPrev =
6390: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a   pList->pLast;..
63a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
63b0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
63c0: 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28  GEMENT.  assert(
63d0: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65  pLink==&pPg->fre
63e0: 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67  e || pLink==&pPg
63f0: 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65  ->gfree);.  asse
6400: 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  rt(pLink==&pPg->
6410: 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d  gfree || pList!=
6420: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6430: 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ist);.#endif..  
6440: 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  if( pList->pLast
6450: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
6460: 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b   = (char *)pLink
6470: 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a   - (char *)pPg;.
6480: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
6490: 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50   *pLastLink = (P
64a0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
64b0: 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c  ((u8 *)pList->pL
64c0: 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  ast)[iOff]);.   
64d0: 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78   pLastLink->pNex
64e0: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65  t = pPg;.  }else
64f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 4c  {.    assert(!pL
6500: 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20  ist->pFirst);.  
6510: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
6520: 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c  = pPg;.  }..  pL
6530: 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ist->pLast = pPg
6540: 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e  ;.  if( !pList->
6550: 70 46 69 72 73 74 53 79 6e 63 65 64 20 26 26 20  pFirstSynced && 
6560: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
6570: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70   ){.    pList->p
6580: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
6590: 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
65a0: 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20  Remove pPg from 
65b0: 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  the list managed
65c0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
65d0: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
65e0: 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  pList..**.** Arg
65f0: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6600: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
6610: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
6620: 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65  pPg->gfree, depe
6630: 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65  nding .** on whe
6640: 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e  ther pPg is bein
6650: 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  g added to the p
6660: 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72  ager-specific or
6670: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
6680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6690: 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65   listRemove(Page
66a0: 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c  rLruList *pList,
66b0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
66c0: 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67  Link, PgHdr *pPg
66d0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
66e0: 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20  (char *)pLink - 
66f0: 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69  (char *)pPg;..#i
6700: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6710: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6720: 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c  MENT.  assert(pL
6730: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20  ink==&pPg->free 
6740: 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  || pLink==&pPg->
6750: 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  gfree);.  assert
6760: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66  (pLink==&pPg->gf
6770: 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73  ree || pList!=&s
6780: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6790: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  t);.#endif..  if
67a0: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
67b0: 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73  irst ){.    pLis
67c0: 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e  t->pFirst = pLin
67d0: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  k->pNext;.  }.  
67e0: 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e  if( pPg==pList->
67f0: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69  pLast ){.    pLi
6800: 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e  st->pLast = pLin
6810: 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  k->pPrev;.  }.  
6820: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  if( pLink->pPrev
6830: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75   ){.    PagerLru
6840: 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20  Link *pPrevLink 
6850: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6860: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b  *)(&((u8 *)pLink
6870: 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b  ->pPrev)[iOff]);
6880: 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e  .    pPrevLink->
6890: 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pNext = pLink->p
68a0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
68b0: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a  pLink->pNext ){.
68c0: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
68d0: 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50   *pNextLink = (P
68e0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
68f0: 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e  ((u8 *)pLink->pN
6900: 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  ext)[iOff]);.   
6910: 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65   pNextLink->pPre
6920: 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  v = pLink->pPrev
6930: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
6940: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79  =pList->pFirstSy
6950: 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
6960: 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e  r *p = pLink->pN
6970: 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ext;.    while( 
6980: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
6990: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c   ){.      PagerL
69a0: 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61  ruLink *pL = (Pa
69b0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28  gerLruLink *)(&(
69c0: 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b  (u8 *)p)[iOff]);
69d0: 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70  .      p = pL->p
69e0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
69f0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6a00: 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
6a10: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  pLink->pNext = p
6a20: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b  Link->pPrev = 0;
6a30: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70  .}../* .** Add p
6a40: 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c  age pPg to the l
6a50: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
6a60: 73 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  s for the pager.
6a70: 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d   If .** memory-m
6a80: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
6a90: 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74  bled, also add t
6aa0: 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 67  he page to the g
6ab0: 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f  lobal .** list o
6ac0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6ae0: 4c 69 73 74 41 64 64 28 50 67 48 64 72 20 2a 70  ListAdd(PgHdr *p
6af0: 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26  Pg){.  listAdd(&
6b00: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75  pPg->pPager->lru
6b10: 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50  , &pPg->free, pP
6b20: 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
6b30: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6b40: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6b50: 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d   !pPg->pPager->m
6b60: 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  emDb ){.    sqli
6b70: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6b80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6b90: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6ba0: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6bb0: 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69     listAdd(&sqli
6bc0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20  te3LruPageList, 
6bd0: 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67  &pPg->gfree, pPg
6be0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6bf0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6c00: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6c10: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6c20: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6c30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  ndif.}../* .** R
6c40: 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20 66  emove page pPg f
6c50: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
6c60: 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74  free pages for t
6c70: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  he associated pa
6c80: 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72  ger..** If memor
6c90: 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
6ca0: 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65  enabled, also re
6cb0: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
6cc0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a  e global list.**
6cd0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a   of free pages..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6cf0: 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48  ruListRemove(PgH
6d00: 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74  dr *pPg){.  list
6d10: 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61  Remove(&pPg->pPa
6d20: 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e  ger->lru, &pPg->
6d30: 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64  free, pPg);.#ifd
6d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6d50: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6d60: 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70  NT.  if( !pPg->p
6d70: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
6d80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
6d90: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
6da0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
6db0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6dc0: 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52  LRU));.    listR
6dd0: 65 6d 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72  emove(&sqlite3Lr
6de0: 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d  uPageList, &pPg-
6df0: 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20  >gfree, pPg);.  
6e00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6e10: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
6e20: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6e30: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6e40: 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  U));.  }.#endif.
6e50: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  }../* .** This f
6e60: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6e70: 64 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  d just after the
6e80: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 68   needSync flag h
6e90: 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 0a  as been cleared.
6ea0: 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67 65  ** from all page
6eb0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 70 50 61  s managed by pPa
6ec0: 67 65 72 20 28 75 73 75 61 6c 6c 79 20 62 65 63  ger (usually bec
6ed0: 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
6ee0: 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75 73   file.** has jus
6ef0: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 29 2e 20  t been synced). 
6f00: 49 74 20 75 70 64 61 74 65 73 20 74 68 65 20 70  It updates the p
6f10: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
6f20: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
6f30: 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d 6f  .** and, if memo
6f40: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6f50: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 73 71   enabled, the sq
6f60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f70: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 0a 2a 2a  .pFirstSynced.**
6f80: 20 76 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e 0a   variable also..
6f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6fa0: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
6fb0: 6e 63 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  nced(Pager *pPag
6fc0: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6c  er){.  pPager->l
6fd0: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  ru.pFirstSynced 
6fe0: 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  = pPager->lru.pF
6ff0: 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  irst;.#ifdef SQL
7000: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
7010: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
7020: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
7030: 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  b ){.    PgHdr *
7040: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  p;.    sqlite3_m
7050: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
7060: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
7070: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
7080: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f  IC_LRU));.    fo
7090: 72 28 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61  r(p=sqlite3LruPa
70a0: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70  geList.pFirst; p
70b0: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b   && p->needSync;
70c0: 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78   p=p->gfree.pNex
70d0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  t);.    assert(p
70e0: 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
70f0: 69 72 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d  irstSynced || p=
7100: 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  =sqlite3LruPageL
7110: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
7120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72  );.    sqlite3Lr
7130: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7140: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
7150: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7160: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
7170: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
7180: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
7190: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
71a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
71b0: 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67 20  ue if page *pPg 
71c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
71d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
71e0: 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75  statement.** jou
71f0: 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65  rnal (or stateme
7200: 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20  nt snapshot has 
7210: 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66  been created, if
7220: 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a   *pPg is part.**
7230: 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   of an in-memory
7240: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
7250: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
7260: 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20  Statement(PgHdr 
7270: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
7280: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
7290: 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ager;.  if( MEMD
72a0: 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  B ){.    return 
72b0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
72c0: 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74  g, pPager)->inSt
72d0: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
72e0: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
72f0: 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38 20 2a  ->pgno;.    u8 *
7300: 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  a = pPager->aInS
7310: 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tmt;.    return 
7320: 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  (a && (int)pgno<
7330: 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
7340: 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38 5d 20  e && (a[pgno/8] 
7350: 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
7360: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7370: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
7380: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
7390: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
73a0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
73b0: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
73c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
73d0: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
73e0: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
73f0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
7400: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
7410: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
7420: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
7430: 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
7440: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
7450: 33 4d 61 6c 6c 6f 63 42 65 6e 69 67 6e 46 61 69  3MallocBenignFai
7460: 6c 75 72 65 28 28 69 6e 74 29 70 50 61 67 65 72  lure((int)pPager
7470: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 61 48 61 73  ->aHash);.  aHas
7480: 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  h = sqlite3Mallo
7490: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61 48  cZero( sizeof(aH
74a0: 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 70  ash[0])*N );.  p
74b0: 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
74c0: 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d  );.  if( aHash==
74d0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c  0 ){.    /* Fail
74e0: 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73  ure to rehash is
74f0: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20   not an error.  
7500: 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72  It is only a per
7510: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f  formance hit. */
7520: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7530: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
7540: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
7550: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
7560: 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = N;.  pPager->a
7570: 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20  Hash = aHash;.  
7580: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7590: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
75a0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
75b0: 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66     int h;.    if
75c0: 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
75d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
75e0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d  pPg->pNextHash==
75f0: 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48  0 && pPg->pPrevH
7600: 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
7610: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
7620: 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e      h = pPg->pgn
7630: 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70  o & (N-1);.    p
7640: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
7650: 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66  aHash[h];.    if
7660: 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ( aHash[h] ){.  
7670: 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50      aHash[h]->pP
7680: 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
7690: 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68     }.    aHash[h
76a0: 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67  ] = pPg;.    pPg
76b0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
76c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
76d0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
76e0: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
76f0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
7700: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
7710: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
7720: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
7730: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7740: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
7750: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
7760: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
7770: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7780: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
7790: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
77a0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
77b0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
77c0: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
77d0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
77e0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
77f0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e  u32 *pRes){.  un
7800: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
7810: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ];.  int rc = sq
7820: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
7830: 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20  ac, sizeof(ac), 
7840: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
7850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7860: 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69      *pRes = sqli
7870: 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b  te3Get4byte(ac);
7880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
78a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
78b0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
78c0: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
78d0: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
78e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33  .*/.#define put3
78f0: 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69  2bits(A,B)  sqli
7900: 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a  te3Put4byte((u8*
7910: 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  )A,B)../*.** Wri
7920: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
7930: 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76  ger into the giv
7940: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
7950: 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  or.  Return SQLI
7960: 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
7970: 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
7980: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
7990: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
79a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
79b0: 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  e32bits(sqlite3_
79c0: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
79d0: 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a  fset, u32 val){.
79e0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
79f0: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
7a00: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
7a10: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
7a20: 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ac, 4, offset);.
7a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65  }../*.** If file
7a40: 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61   pFd is open, ca
7a50: 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  ll sqlite3OsUnlo
7a60: 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73  ck() on it..*/.s
7a70: 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f  tatic int osUnlo
7a80: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
7a90: 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  *pFd, int eLock)
7aa0: 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d  {.  if( !pFd->pM
7ab0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65  ethods ){.    re
7ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7ad0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
7ae0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
7af0: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
7b00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7b10: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
7b20: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
7b30: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
7b40: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
7b50: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
7b60: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
7b70: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
7b80: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
7b90: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
7ba0: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
7bb0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
7bc0: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
7bd0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
7be0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
7bf0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
7c00: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
7c10: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
7c20: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
7c30: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
7c40: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
7c50: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
7c60: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
7c70: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
7c80: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
7c90: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
7ca0: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
7cb0: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
7cc0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
7cd0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
7ce0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
7cf0: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
7d00: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
7d10: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
7d20: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
7d30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7d40: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
7d50: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
7d60: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
7d70: 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20  ger){.  int dc; 
7d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
7d90: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
7da0: 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ics */.  int nSe
7db0: 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65  ctor;      /* Se
7dc0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69  ctor size */.  i
7dd0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
7de0: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
7df0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7e00: 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
7e10: 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65  ;..  if( fd->pMe
7e20: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20  thods ){.    dc 
7e30: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
7e40: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7e50: 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  (fd);.    nSecto
7e60: 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  r = sqlite3OsSec
7e70: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20  torSize(fd);.   
7e80: 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d   nPage = pPager-
7e90: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a  >pageSize;.  }..
7ea0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
7eb0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
7ec0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73  =(512>>8));.  as
7ed0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
7ee0: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
7ef0: 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28  536>>8));..  if(
7f00: 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c   !fd->pMethods |
7f10: 7c 20 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  | (dc&(SQLITE_IO
7f20: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67  CAP_ATOMIC|(nPag
7f30: 65 3e 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c  e>>8))&&nSector<
7f40: 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72  =nPage) ){.    r
7f50: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
7f60: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
7f70: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
7f80: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
7f90: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
7fa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7fb0: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
7fc0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72  lled when an err
7fd0: 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
7fe0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f   the pager.** co
7ff0: 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  de. The first ar
8000: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
8010: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
8020: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a   structure, the.
8030: 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  ** second the er
8040: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
8050: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
8060: 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e   a pager API fun
8070: 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76  ction. .** The v
8080: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
8090: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
80a0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
80b0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
80c0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
80d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
80e0: 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  s SQLITE_IOERR, 
80f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
8100: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a  or SQLITE_FULL.*
8110: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
8120: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
8130: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41  All subsequent A
8140: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
8150: 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69   Pager.** will i
8160: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
8170: 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
8180: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
8190: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
81a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
81b0: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
81c0: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
81d0: 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
81e0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
81f0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
8200: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
8210: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
8220: 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
8230: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
8240: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
8250: 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20  ERR.  );.  if(. 
8260: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
8270: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
8280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
8290: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
82a0: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
82b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
82c0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
82d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
82e0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
82f0: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
8300: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
8310: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
8320: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
8330: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
8340: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
8350: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
8360: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
8370: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
8380: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
8390: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
83a0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
83b0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
83c0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
83d0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
83e0: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
83f0: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
8400: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
8410: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
8420: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
8430: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
8440: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
8450: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
8460: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
8470: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
8480: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
8490: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
84a0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
84b0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
84c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
84d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
84e0: 20 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69             (unsi
84f0: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
8500: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
8510: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8520: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
8530: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
8540: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
8550: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
8560: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
8570: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
8580: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
8590: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
85a0: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
85b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
85c0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
85d0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
85e0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
85f0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
8600: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
8610: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
8620: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
8630: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
8640: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
8650: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
8660: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
8670: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
8680: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
8690: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
86a0: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
86b0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
86c0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
86d0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
86e0: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
86f0: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
8700: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
8710: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
8720: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
8730: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
8740: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
8750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8760: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
8770: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
8780: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
8790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
87a0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
87b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
87c0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
87d0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
87e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
87f0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 2a 70  te3_malloc(). *p
8800: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
8810: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
8820: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
8830: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
8840: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
8850: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65  .** sqlite3_free
8860: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
8870: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
8880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8890: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
88a0: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
88b0: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
88c0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
88d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
88e0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
88f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
8900: 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73  nl, char **pzMas
8910: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
8920: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
8930: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
8940: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  m;.  int i;.  un
8950: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
8960: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
8970: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
8980: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
8990: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
89a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
89b0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
89c0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
89d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
89e0: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
89f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
8a00: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8a10: 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  J-16, &len);.  i
8a20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8a30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8a40: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8a50: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
8a60: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
8a70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8a80: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8a90: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8aa0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
8ab0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
8ac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8ad0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8ae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
8af0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
8b00: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63    *pzMaster = (c
8b10: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  har *)sqlite3Mal
8b20: 6c 6f 63 5a 65 72 6f 28 6c 65 6e 2b 31 29 3b 0a  locZero(len+1);.
8b30: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
8b40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8b50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
8b60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8b70: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a  sRead(pJrnl, *pz
8b80: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
8b90: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
8ba0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8bc0: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
8bd0: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
8be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8bf0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
8c00: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
8c10: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
8c20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
8c30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
8c40: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
8c50: 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72  um -= (*pzMaster
8c60: 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )[i];.  }.  if( 
8c70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
8c80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
8c90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
8ca0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
8cb0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
8cc0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
8cd0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
8ce0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
8cf0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
8d00: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
8d10: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
8d20: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
8d30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8d40: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
8d50: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
8d60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
8d70: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
8d80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a  sqlite3_free(*pz
8d90: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
8da0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65  Master = 0;.  }e
8db0: 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73  lse{.    (*pzMas
8dc0: 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ter)[len] = '\0'
8dd0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
8de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
8e00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
8e10: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
8e20: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
8e30: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
8e40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
8e50: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
8e60: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
8e70: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
8e80: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
8e90: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
8ea0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
8eb0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
8ec0: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
8ed0: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
8ee0: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
8ef0: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
8f40: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
8f50: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
8f60: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
8f70: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
8f80: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
8f90: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
8fa0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  * .*/.static voi
8fb0: 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  d seekJournalHdr
8fc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8fd0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
8fe0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
8ff0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9000: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
9010: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
9020: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9030: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
9040: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9050: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
9060: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
9070: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9080: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
9090: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
90a0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
90b0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
90c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
90d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
90e0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  ff = offset;.}..
90f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9100: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9110: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9120: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9130: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9140: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9150: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9160: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9170: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9180: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9190: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
91a0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
91b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
91c0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
91d0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
91e0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
91f0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
9200: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9210: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9220: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9230: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9240: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9250: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9260: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9270: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9280: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9290: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
92a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
92b0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
92c0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
92d0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
92e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
92f0: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
9300: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
9310: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
9320: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
9330: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
9340: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
9350: 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65  ger){.  char zHe
9360: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9370: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a  rnalMagic)+16];.
9380: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
9390: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
93a0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
93b0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
93c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
93d0: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65  alOff;.  }..  se
93e0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
93f0: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
9400: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
9410: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9420: 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  ..  memcpy(zHead
9430: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
9440: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
9450: 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a  alMagic));..  /*
9460: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
9470: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
9480: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
9490: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
94a0: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
94b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
94c0: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
94d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
94e0: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
94f0: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
9500: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
9510: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
9520: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
9530: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
9540: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
9550: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
9560: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
9570: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
9580: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
9590: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
95a0: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
95b0: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
95c0: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
95d0: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
95e0: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
95f0: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
9600: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
9610: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
9620: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
9630: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
9640: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
9650: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
9660: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
9670: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
9680: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
9690: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
96a0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
96b0: 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
96c0: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
96d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
96e0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
96f0: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
9700: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
9710: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
9720: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
9730: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
9740: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9750: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
9760: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
9770: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
9780: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
9790: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
97a0: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
97b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
97c0: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
97d0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
97e0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
97f0: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
9800: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
9810: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
9820: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
9830: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
9840: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50    */.  assert(pP
9850: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
9860: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ds||pPager->noSy
9870: 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  nc);.  if( (pPag
9880: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20  er->noSync) .   
9890: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
98a0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
98b0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
98c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
98d0: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
98e0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
98f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9900: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
9910: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
9920: 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74  se{.    put32bit
9930: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9940: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9950: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ], 0);.  }..  /*
9960: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
9970: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
9980: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
9990: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
99a0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
99b0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
99c0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
99d0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
99e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
99f0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
9a00: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
9a10: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
9a20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
9a30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9a40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9a50: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
9a60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
9a70: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
9a80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
9a90: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
9aa0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
9ab0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9ac0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
9ad0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
9ae0: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
9af0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
9b00: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
9b10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9b20: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
9b30: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
9b40: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9b50: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
9b60: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
9b70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9b80: 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ff);.  pPager->j
9b90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
9ba0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9bb0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  er);..  /* The j
9bc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
9bd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
9be0: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
9bf0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
9c00: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
9c10: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
9c20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9c30: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
9c40: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9c50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52  E_OK ){.    IOTR
9c60: 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25  ACE(("JTAIL %p %
9c70: 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
9c80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c90: 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20  ff-1)).    rc = 
9ca0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9cb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
9cc0: 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a  0", 1, pPager->j
9cd0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
9ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9cf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
9d00: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
9d10: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
9d20: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
9d30: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
9d40: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
9d50: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
9d60: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
9d70: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
9d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
9d90: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
9da0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
9db0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
9dc0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
9dd0: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
9de0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
9df0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
9e00: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
9e10: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
9e20: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
9e30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
9e40: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
9e50: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
9e60: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
9e70: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
9e80: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
9e90: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
9ea0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
9eb0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
9ec0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
9ed0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
9ee0: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
9ef0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
9f00: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
9f10: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
9f20: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
9f30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
9f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
9f50: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
9f60: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
9f70: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
9f80: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
9f90: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
9fa0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
9fb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9fc0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
9fd0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9fe0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
9ff0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
a000: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
a010: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
a020: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
a030: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
a040: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
a050: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
a060: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
a070: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
a080: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
a090: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
a0a0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
a0b0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
a0c0: 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  lOff;..  seekJou
a0d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
a0e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
a0f0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
a100: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a110: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
a120: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a130: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
a140: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a150: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
a160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a170: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
a180: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
a190: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
a1a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a1b0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
a1c0: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
a1d0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
a1e0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
a1f0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
a200: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
a210: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a220: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
a230: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a240: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a250: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
a260: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a270: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a280: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a290: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
a2a0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a2b0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
a2c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a2d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a2e0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a2f0: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
a300: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a310: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
a320: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a330: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a340: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a350: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
a360: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a370: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a380: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a390: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
a3a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a3b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a3c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a3d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
a3e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a3f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a400: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a410: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
a420: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
a430: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
a440: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
a450: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
a460: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a470: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a480: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
a490: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
a4a0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
a4b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a4c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a4d0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
a4e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
a4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a500: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
a510: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a520: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a530: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a540: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a550: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a560: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a570: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a580: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a590: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a5a0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a5b0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a5c0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a5d0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a5e0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a5f0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a600: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a610: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a620: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a630: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a640: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a650: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a660: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
a670: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
a680: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
a690: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
a6a0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
a6b0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
a6c0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a6d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
a6e0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
a6f0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
a700: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
a710: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
a720: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
a730: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
a740: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
a750: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
a760: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
a770: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
a780: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
a790: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
a7a0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
a7b0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
a7c0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
a7d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
a7e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
a7f0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
a800: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
a810: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
a820: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
a830: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
a840: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
a850: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
a860: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
a870: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
a880: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
a890: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
a8a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a8b0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
a8c0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
a8d0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
a8e0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
a8f0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
a900: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
a910: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
a920: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
a930: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
a940: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
a950: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
a960: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
a970: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a980: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
a990: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
a9a0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
a9b0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
a9c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
a9d0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
a9e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
a9f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
aa00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
aa10: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
aa20: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
aa30: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
aa40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
aa50: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
aa60: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
aa70: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
aa80: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
aa90: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
aaa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aab0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
aac0: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
aad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
aae0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
aaf0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
ab00: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
ab10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ab20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ab30: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
ab40: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
ab50: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
ab60: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
ab70: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
ab80: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
ab90: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
aba0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
abb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
abc0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
abd0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
abe0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
abf0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  rnlOff);.  pPage
ac00: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
ac10: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
ac20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac30: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
ac40: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
ac50: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
ac60: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
ac70: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
ac80: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
ac90: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
aca0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
acb0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
acc0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
acd0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
ace0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
acf0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
ad00: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
ad10: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
ad20: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
ad30: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
ad40: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
ad50: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
ad60: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
ad70: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
ad80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ad90: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
ada0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
adb0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
adc0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
add0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
ade0: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
adf0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
ae00: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
ae10: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
ae20: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
ae30: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
ae40: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ae50: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
ae60: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
ae70: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
ae80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
ae90: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
aea0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
aeb0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
aec0: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
aed0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
aee0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
aef0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
af00: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
af10: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
af20: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
af30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
af40: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
af50: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
af60: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
af70: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
af80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
af90: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
afa0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
afb0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
afc0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
afd0: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
afe0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
aff0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
b000: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
b010: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
b020: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
b030: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
b040: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
b050: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
b060: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
b070: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
b080: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b090: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
b0a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
b0b0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
b0c0: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
b0d0: 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
b0e0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
b0f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   ){.    if( !MEM
b100: 44 42 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  DB ){.      osUn
b110: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
b120: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
b130: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b140: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
b150: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
b160: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
b170: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
b180: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
b190: 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  OCK;.    pPager-
b1a0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
b1b0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
b1c0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
b1d0: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
b1e0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
b1f0: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
b200: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
b210: 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  e. This is a no-
b220: 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20  op if the pager 
b230: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
b240: 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  red.** the error
b250: 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  -state..*/.stati
b260: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
b270: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
b280: 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ger *p){.  if( p
b290: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
b2a0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
b2b0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
b2c0: 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75  SERVED || p->jou
b2d0: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
b2e0: 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50   if( p->state>=P
b2f0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
b300: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
b310: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
b320: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
b330: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
b340: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
b350: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
b360: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
b370: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
b380: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
b390: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
b3a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
b3b0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
b3c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
b3d0: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
b3e0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
b3f0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
b400: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
b410: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
b420: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
b430: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
b440: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
b450: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
b460: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
b470: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
b480: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
b490: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
b4a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
b4b0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
b4c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b4d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
b4e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
b4f0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
b500: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b510: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
b520: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
b530: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
b540: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54  =pNext){.    IOT
b550: 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
b560: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
b570: 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
b580: 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
b590: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
b5a0: 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65  _count);.    pNe
b5b0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
b5c0: 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52  ll;.    lruListR
b5d0: 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20  emove(pPg);.    
b5e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
b5f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b600: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b610: 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  st==0);.  assert
b620: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
b630: 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20  rstSynced==0);. 
b640: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b650: 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20  lru.pLast==0);. 
b660: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b670: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
b680: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
b690: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
b6a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
b6b0: 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50  er->aHash);.  pP
b6c0: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
b6d0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
b6e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b6f0: 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nRef = 0;.}../*.
b700: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b710: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
b720: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
b730: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
b740: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
b750: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
b760: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
b770: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b780: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
b790: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
b7a0: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
b7b0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
b7c0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
b7d0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
b7e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
b7f0: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
b800: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
b810: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
b820: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
b830: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
b840: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
b850: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
b860: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
b870: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
b880: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
b890: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
b8a0: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
b8b0: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
b8c0: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
b8d0: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
b8e0: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
b8f0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
b900: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
b910: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
b920: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
b930: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
b940: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
b950: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b960: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
b970: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
b980: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
b990: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
b9a0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
b9b0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
b9c0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
b9d0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
b9e0: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
b9f0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
ba00: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
ba10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ba20: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
ba30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ba40: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
ba50: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
ba60: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
ba70: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
ba80: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
ba90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
baa0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
bab0: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
bac0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
bad0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
bae0: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
baf0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
bb00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
bb10: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
bb20: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
bb30: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
bb40: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
bb50: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
bb60: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
bb70: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
bb80: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
bb90: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
bba0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
bbb0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
bbc0: 7b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  {;.      pPager-
bbd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
bbe0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
bbf0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
bc00: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
bc10: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bc20: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
bc30: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
bc40: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
bc50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
bc60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bc70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
bc80: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
bc90: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
bca0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
bcb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
bcc0: 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67  lite3_free( pPag
bcd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
bce0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
bcf0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
bd00: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
bd10: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
bd20: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
bd30: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
bd40: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
bd50: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
bd60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
bd70: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
bd80: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
bd90: 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ack = 0;.#ifdef 
bda0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
bdb0: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
bdc0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
bdd0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
bde0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
bdf0: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
be00: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
be10: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
be20: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
be30: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
be40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
be50: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
be60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
be70: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
be80: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
be90: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
bea0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
beb0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
bec0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
bed0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
bee0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
bef0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
bf00: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
bf10: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
bf20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
bf30: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
bf40: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
bf50: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
bf60: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
bf70: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
bf80: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
bf90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
bfa0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
bfb0: 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74   0;.  lruListSet
bfc0: 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
bfd0: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
bfe0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
bff0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
c000: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
c010: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
c020: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
c030: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
c040: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
c050: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
c060: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
c070: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
c080: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c090: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
c0a0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
c0b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
c0c0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
c0d0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
c0e0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
c0f0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
c100: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
c110: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
c120: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
c130: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
c140: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
c150: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
c160: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
c170: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
c180: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
c190: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
c1a0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
c1b0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
c1c0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
c1d0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
c1e0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
c1f0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
c200: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
c210: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
c220: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
c230: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
c240: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
c250: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
c260: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
c270: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
c280: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
c290: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
c2a0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
c2b0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
c2c0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
c2d0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
c2e0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
c2f0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
c300: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
c310: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
c320: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
c330: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
c340: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
c350: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
c360: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
c370: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
c380: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
c390: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
c3a0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
c3b0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
c3c0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
c3d0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
c3e0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
c3f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
c400: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
c410: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
c420: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
c430: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
c440: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
c450: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
c460: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
c470: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
c480: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
c490: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
c4a0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
c4b0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
c4c0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
c4d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
c4e0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
c4f0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
c500: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
c510: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
c520: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
c530: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
c540: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c550: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
c560: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
c570: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
c580: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
c590: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
c5a0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
c5b0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
c5c0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
c5d0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
c5e0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
c5f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
c600: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
c610: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
c620: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
c630: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
c640: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
c650: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
c660: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
c670: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
c680: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
c690: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
c6a0: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
c6b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
c6c0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6e0: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
c6f0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
c700: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
c730: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
c740: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
c750: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
c760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c770: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
c780: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c790: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
c7a0: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
c7b0: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
c7c0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
c7d0: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
c7e0: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
c7f0: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
c800: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
c810: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
c820: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c830: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
c840: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
c850: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
c860: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
c870: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
c880: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
c890: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
c8a0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
c8b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
c8c0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
c8d0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
c8e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
c8f0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
c900: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
c910: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
c920: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
c930: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
c940: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c950: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
c960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
c970: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
c980: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
c990: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
c9a0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
c9b0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
c9c0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
c9d0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
c9e0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
c9f0: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
ca00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
ca10: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
ca20: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
ca30: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
ca40: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ca50: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
ca60: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
ca70: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
ca80: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
ca90: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
caa0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
cab0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
cac0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
cad0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
cae0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
caf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
cb00: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
cb10: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
cb20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
cb30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cb40: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
cb50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
cb60: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
cb70: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
cb80: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
cb90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
cba0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
cbb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cbc0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
cbd0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
cbe0: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
cbf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
cc00: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
cc10: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
cc20: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
cc30: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
cc40: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
cc50: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
cc60: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
cc70: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
cc80: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
cc90: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
cca0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
ccb0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
ccc0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
ccd0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
cce0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
ccf0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
cd00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cd10: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
cd20: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
cd30: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
cd40: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
cd50: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
cd60: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
cd70: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
cd80: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
cd90: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
cda0: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
cdb0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
cdc0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
cdd0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
cde0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
cdf0: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
ce00: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
ce10: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
ce20: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
ce30: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
ce40: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
ce50: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
ce60: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
ce70: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
ce80: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
ce90: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
cea0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
ceb0: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
cec0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
ced0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
cee0: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
cef0: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
cf00: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
cf10: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
cf20: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
cf30: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
cf40: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
cf50: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
cf60: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
cf70: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
cf80: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
cf90: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
cfa0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
cfb0: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
cfc0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
cfd0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
cfe0: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
cff0: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
d000: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
d010: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
d020: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
d030: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
d040: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
d050: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
d060: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
d070: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
d080: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
d090: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
d0a0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
d0b0: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
d0c0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
d0d0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
d0e0: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
d0f0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
d100: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
d110: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
d120: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
d130: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
d140: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
d150: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d160: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
d170: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
d180: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
d190: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
d1a0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
d1b0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
d1c0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
d1d0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
d1e0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
d1f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
d200: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
d210: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
d220: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
d230: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
d240: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
d250: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
d260: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
d270: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
d280: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
d290: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
d2a0: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
d2b0: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
d2c0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
d2d0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
d2e0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
d2f0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
d300: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
d310: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
d320: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
d330: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
d340: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
d350: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
d360: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
d370: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
d380: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
d390: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
d3a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
d3b0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
d3c0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
d3d0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
d3e0: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
d3f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
d400: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d410: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
d420: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
d430: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
d440: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
d450: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
d460: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
d470: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
d480: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
d490: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
d4a0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
d4b0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
d4c0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
d4d0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
d4e0: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
d4f0: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
d500: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
d510: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
d520: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
d530: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
d540: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
d550: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
d560: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
d570: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
d580: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
d590: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
d5a0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
d5b0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
d5c0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
d5d0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
d5e0: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
d5f0: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
d600: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
d610: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
d620: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
d630: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
d640: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d650: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
d660: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
d670: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
d680: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
d690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
d6a0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
d6b0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
d6c0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
d6d0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
d6e0: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
d6f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
d700: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
d710: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
d720: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
d730: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
d740: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
d750: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
d760: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
d770: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
d780: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
d790: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
d7a0: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
d7b0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
d7c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d7d0: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
d7e0: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
d7f0: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
d800: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
d810: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
d820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
d840: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
d850: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
d860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d870: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
d880: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
d890: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
d8a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d8b0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
d8c0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
d8d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d8e0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
d8f0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
d900: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d910: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
d920: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
d930: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
d940: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d950: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
d960: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
d970: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
d980: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
d990: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
d9a0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
d9b0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
d9c0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
d9d0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
d9e0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
d9f0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
da00: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
da10: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
da20: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
da30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
da40: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
da50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
da60: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
da70: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
da80: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
da90: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
daa0: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
dab0: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
dac0: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
dad0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
dae0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
daf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
db00: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
db10: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
db20: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
db30: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
db40: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
db50: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
db60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
db70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
db80: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
db90: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
dba0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
dbb0: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
dbc0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
dbd0: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
dbe0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
dbf0: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
dc00: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
dc10: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
dc20: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
dc30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
dc40: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
dc50: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
dc60: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
dc70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
dc80: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
dc90: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
dca0: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
dcb0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
dcc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
dcd0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
dce0: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
dcf0: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
dd00: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
dd10: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
dd20: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
dd30: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
dd40: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
dd50: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
dd60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
dd70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
dd80: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
dd90: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
dda0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
ddb0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
ddc0: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
ddd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
dde0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ddf0: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
de00: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
de10: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
de20: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
de30: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
de40: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
de50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
de60: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
de70: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
de80: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
de90: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
dea0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
deb0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
dec0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
ded0: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
dee0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61  lite3_malloc(nMa
def0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
df00: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
df10: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
df20: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
df30: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
df40: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
df50: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
df60: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
df70: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
df80: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
df90: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
dfa0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
dfb0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
dfc0: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
dfd0: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
dfe0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
dff0: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
e000: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
e010: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
e020: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
e030: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
e040: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
e050: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
e060: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
e070: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
e080: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
e090: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
e0a0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
e0b0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
e0c0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
e0d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e0e0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
e0f0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
e100: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
e110: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e120: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
e130: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
e140: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
e150: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
e160: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
e170: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
e180: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
e190: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e1a0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
e1b0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
e1c0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
e1d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
e1f0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e200: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
e210: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
e220: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
e230: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
e240: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
e250: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
e260: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
e270: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e280: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
e290: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e2a0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
e2b0: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
e2c0: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
e2d0: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
e2e0: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
e2f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
e300: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
e310: 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
e320: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
e330: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
e340: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e350: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e360: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
e370: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e380: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e390: 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
e3a0: 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a  al += (strlen(zJ
e3b0: 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
e3c0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
e3d0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e3e0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
e3f0: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
e400: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
e410: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
e420: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
e430: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
e440: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
e450: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
e460: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
e470: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
e480: 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
e490: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e4a0: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  ...static void p
e4b0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
e4c0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
e4d0: 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  r);../*.** Trunc
e4e0: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
e4f0: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
e500: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
e510: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
e520: 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74  ndicated. Also t
e530: 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
e540: 65 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ed representatio
e550: 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a  n of the file..*
e560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
e570: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
e580: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
e590: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
e5a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e5b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
e5c0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e5d0: 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  E && pPager->fd-
e5e0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
e5f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
e600: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e610: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
e620: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
e630: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
e640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e650: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
e660: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
e670: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
e680: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
e690: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e6a0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
e6b0: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
e6c0: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
e6d0: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
e6e0: 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72  ze is the larger
e6f0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   of the sector s
e700: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
e710: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
e720: 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65  orSize() and the
e730: 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74   pageSize..*/.st
e740: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
e750: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
e760: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
e770: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
e780: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
e790: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
e7a0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e7b0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
e7c0: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
e7d0: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
e7e0: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
e7f0: 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
e800: 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
e810: 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
e820: 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
e830: 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
e840: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
e850: 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
e860: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
e870: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
e880: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
e890: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
e8a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
e8b0: 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72  ectorSize<pPager
e8c0: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
e8d0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
e8e0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
e8f0: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
e900: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
e910: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
e920: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
e930: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
e940: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
e950: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
e960: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
e970: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
e980: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e990: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
e9a0: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
e9b0: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
e9c0: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
e9d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
e9e0: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
e9f0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
ea00: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
ea10: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
ea20: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
ea30: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
ea40: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
ea50: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
ea60: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
ea70: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
ea80: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
ea90: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
eaa0: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
eab0: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
eac0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
ead0: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
eae0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
eaf0: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
eb00: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
eb10: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
eb20: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
eb30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
eb40: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
eb50: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
eb60: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
eb70: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
eb80: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
eb90: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
eba0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ebb0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
ebc0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
ebd0: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
ebe0: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
ebf0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
ec00: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
ec10: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
ec20: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
ec30: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
ec40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
ec50: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
ec60: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
ec70: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
ec80: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
ec90: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
eca0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
ecb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
ecc0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
ecd0: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
ece0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
ecf0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
ed00: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
ed10: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
ed20: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
ed30: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
ed40: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
ed50: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
ed60: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
ed70: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
ed80: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
ed90: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
eda0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
edb0: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
edc0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
edd0: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
ede0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
edf0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
ee00: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
ee10: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
ee20: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
ee30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
ee40: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
ee50: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
ee60: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
ee70: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
ee80: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
ee90: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
eea0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
eeb0: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
eec0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
eed0: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
eee0: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
eef0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
ef00: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
ef10: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ef20: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
ef30: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
ef40: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
ef50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
ef60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
ef70: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
ef80: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
ef90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
efa0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
efb0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
efc0: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
efd0: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
efe0: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
eff0: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
f000: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
f010: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
f020: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
f030: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
f040: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
f050: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
f060: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
f070: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
f080: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
f090: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
f0a0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
f0b0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
f0c0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
f0d0: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
f0e0: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
f0f0: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
f100: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
f110: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
f120: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
f130: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
f140: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
f150: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
f160: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
f170: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
f180: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
f190: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
f1a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
f1b0: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
f1c0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
f1d0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
f1e0: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
f1f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
f200: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
f210: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f220: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
f230: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
f240: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
f250: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
f260: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
f270: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
f280: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
f290: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
f2a0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
f2b0: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
f2c0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
f2d0: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
f2e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
f2f0: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
f300: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
f310: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
f320: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
f330: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
f340: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
f350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
f360: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
f370: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
f380: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f390: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f3a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
f3b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f3c0: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
f3d0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
f3e0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
f3f0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
f400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f410: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
f420: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
f430: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f450: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
f460: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
f470: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
f4a0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
f4b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
f4c0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
f4d0: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
f4e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
f510: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
f520: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
f530: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
f540: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
f550: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
f560: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
f570: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
f580: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
f590: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
f5a0: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
f5b0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
f5c0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
f5d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f5e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
f5f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
f600: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
f610: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
f620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f630: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
f640: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
f650: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
f660: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
f670: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
f680: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
f690: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
f6a0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
f6b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
f6c0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
f6d0: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
f6e0: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
f6f0: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
f700: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
f710: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
f720: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
f730: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
f740: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
f750: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
f760: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
f770: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
f780: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
f790: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f7a0: 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d  TE_OK .   || (zM
f7b0: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
f7c0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f7d0: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
f7e0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29 20  ACCESS_EXISTS)) 
f7f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
f800: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
f810: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
f820: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f830: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
f840: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
f850: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
f860: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
f870: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
f880: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
f890: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
f8a0: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
f8b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
f8c0: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
f8d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
f8e0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f8f0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
f900: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
f910: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
f920: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
f930: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
f940: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
f950: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
f960: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
f970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f980: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
f990: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
f9a0: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
f9b0: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
f9c0: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
f9d0: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
f9e0: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
f9f0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
fa00: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
fa10: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
fa20: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
fa30: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
fa40: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
fa50: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
fa60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
fa70: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
fa80: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
fa90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
faa0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
fab0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
fac0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
fad0: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
fae0: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
faf0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
fb00: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
fb10: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
fb20: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
fb30: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
fb40: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
fb50: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
fb60: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
fb70: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
fb80: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
fb90: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
fba0: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
fbb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
fbc0: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
fbd0: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
fbe0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
fbf0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
fc00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
fc10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
fc20: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
fc30: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
fc40: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
fc50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
fc60: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
fc70: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
fc80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
fc90: 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
fca0: 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
fcb0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
fcc0: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
fcd0: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
fce0: 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
fcf0: 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
fd00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
fd10: 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
fd20: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
fd30: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
fd40: 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
fd50: 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
fd60: 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
fd70: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
fd80: 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
fd90: 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
fda0: 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
fdb0: 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
fdc0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
fdd0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
fde0: 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
fdf0: 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
fe00: 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
fe10: 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
fe20: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
fe30: 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
fe40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fe50: 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
fe60: 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
fe70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
fe80: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
fe90: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
fea0: 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
feb0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
fec0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
fed0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
fee0: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
fef0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
ff00: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
ff10: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
ff20: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
ff30: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
ff40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ff50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ff60: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
ff70: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
ff80: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ff90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
ffa0: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
ffb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ffc0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
ffd0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ffe0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
fff0: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
10000 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
10010 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
10020 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
10030 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
10040 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10050 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
10060 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
10070 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
10080 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
10090 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
100a0 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
100b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
100c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
100d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
100e0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
100f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10100 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
10110 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
10120 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
10130 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
10140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
10150 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10170 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
10180 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
10190 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
101a0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
101b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
101c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
101d0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
101e0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
101f0 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
10200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10210 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
10220 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
10230 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
10240 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
10250 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
10260 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
10270 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10280 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
10290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
102a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
102b0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
102c0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
102d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
102e0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
102f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
10300 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
10310 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
10320 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
10330 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
10340 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
10350 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
10360 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
10370 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
10380 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
10390 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
103a0 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
103b0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
103c0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
103d0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
103e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
103f0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
10400 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10410 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
10420 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
10430 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
10440 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
10450 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
10460 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
10470 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
10480 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
10490 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
104a0 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
104b0 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
104c0 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
104d0 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
104e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
104f0 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
10500 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
10510 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
10520 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
10530 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
10540 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
10550 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
10560 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
10570 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
10580 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
10590 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
105a0 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
105b0 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
105c0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
105d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
105e0 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
105f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10600 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
10610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10620 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
10630 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
10640 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
10650 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10660 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10670 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
10680 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10690 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
106a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
106b0 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
106c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
106d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
106e0 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
106f0 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
10700 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10710 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
10720 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
10730 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
10740 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
10750 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
10760 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
10770 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
10780 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
10790 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
107a0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
107b0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
107c0 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
107d0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
107e0 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
107f0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
10800 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
10810 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
10820 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
10830 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
10840 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
10850 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
10860 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
10870 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
10880 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10890 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
108a0 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
108b0 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
108c0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
108d0 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
108e0 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
108f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
10900 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
10910 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
10920 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
10930 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
10940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
10950 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
10960 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
10970 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
10980 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
10990 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
109a0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
109b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
109c0 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
109d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
109e0 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
109f0 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
10a00 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
10a10 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
10a20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10a30 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
10a40 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
10a50 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
10a60 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
10a70 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
10a80 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
10a90 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
10aa0 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
10ab0 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
10ac0 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
10ad0 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
10ae0 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
10af0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
10b00 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
10b10 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
10b20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10b30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
10b40 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
10b50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
10b60 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
10b70 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
10b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10b90 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
10ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
10bb0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
10bc0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
10bd0 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
10be0 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
10bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
10c00 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
10c10 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
10c20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
10c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
10c40 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
10c50 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
10c60 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
10c70 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
10c80 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
10c90 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
10ca0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
10cb0 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
10cc0 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
10cd0 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
10ce0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
10cf0 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
10d00 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
10d10 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
10d20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
10d30 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
10d40 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
10d50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10d60 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
10d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d80 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
10d90 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
10da0 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
10db0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
10dc0 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
10dd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
10de0 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
10df0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
10e00 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
10e10 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
10e20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10e30 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
10e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10e50 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
10e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
10e70 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
10e80 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
10e90 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
10ea0 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
10eb0 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
10ec0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10ed0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
10ee0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
10ef0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
10f00 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
10f10 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
10f20 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
10f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10f40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10f60 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
10f70 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
10f80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
10f90 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
10fa0 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
10fb0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
10fc0 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
10fd0 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
10fe0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
10ff0 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
11000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11010 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
11020 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11030 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
11040 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
11050 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
11060 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
11070 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
11080 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
11090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
110a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
110b0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
110c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
110d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
110e0 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
110f0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
11100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11110 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
11120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
11130 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
11140 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
11150 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
11160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11170 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
11180 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
11190 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
111a0 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
111b0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
111c0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
111d0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
111e0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
111f0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
11200 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
11210 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
11220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
11230 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
11240 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
11250 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
11260 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
11270 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
11280 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
11290 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
112a0 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
112b0 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
112c0 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
112d0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
112e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
112f0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
11300 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
11310 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
11320 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
11330 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
11340 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
11350 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11360 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
11370 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
11380 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
11390 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
113a0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
113b0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
113c0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
113e0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
113f0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
11400 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
11410 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11420 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
11430 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
11440 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
11450 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
11460 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
11470 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
11480 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
11490 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
114a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
114b0 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
114c0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
114d0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
114e0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
114f0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
11500 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
11510 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
11520 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
11530 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
11540 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
11550 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
11560 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
11570 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
11580 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
11590 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
115a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
115b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
115c0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
115d0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
115e0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
115f0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
11600 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
11610 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
11620 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
11630 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
11640 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
11650 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
11660 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
11670 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
11680 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
11690 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
116a0 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
116c0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
116d0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
116e0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
116f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
11700 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
11710 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
11720 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
11730 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
11740 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
11750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11760 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11770 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
11780 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
11790 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
117a0 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
117b0 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
117c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
117d0 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
117e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
117f0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
11800 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
11810 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
11820 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
11830 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
11840 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
11850 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
11860 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
11870 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
11880 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
11890 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
118a0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
118b0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
118c0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
118d0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
118e0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
118f0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
11900 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
11910 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
11920 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
11930 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
11940 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
11950 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
11960 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
11970 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
11980 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
11990 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
119a0 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
119b0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
119c0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
119d0 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
119e0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
119f0 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
11a00 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
11a10 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
11a20 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
11a30 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
11a40 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
11a50 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
11a60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11a70 6c 65 6e 61 6d 65 20 69 73 20 30 2c 20 74 68 65  lename is 0, the
11a80 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
11a90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
11aa0 61 6d 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ame is.** genera
11ab0 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
11ac0 79 20 61 6e 64 20 20 53 51 4c 49 54 45 5f 4f 50  y and  SQLITE_OP
11ad0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 69 73  EN_SUBJOURNAL is
11ae0 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20 74 68   passed to.** th
11af0 65 20 4f 53 20 6c 61 79 65 72 20 61 73 20 74 68  e OS layer as th
11b00 65 20 66 69 6c 65 20 74 79 70 65 2e 0a 2a 2a 0a  e file type..**.
11b10 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
11b20 69 73 20 6e 6f 74 20 30 2c 20 53 51 4c 49 54 45  is not 0, SQLITE
11b30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 69 73  _OPEN_TEMP_DB is
11b40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
11b50 69 6c 65 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61  ile type..*/.sta
11b60 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
11b70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
11b80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11b90 73 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  s, .  sqlite3_fi
11ba0 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 68  le *pFile, .  ch
11bb0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 0a 29 7b  ar *zFilename.){
11bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
11bd0 20 66 6c 61 67 73 20 3d 20 28 0a 20 20 20 20 20   flags = (.     
11be0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11bf0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
11c00 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 53  N_CREATE|.     S
11c10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11c20 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
11c30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 20  _DELETEONCLOSE. 
11c40 20 29 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 46 72   );..  char *zFr
11c50 65 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ee = 0;.  if( zF
11c60 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
11c70 20 20 7a 46 72 65 65 20 3d 20 28 63 68 61 72 20    zFree = (char 
11c80 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
11c90 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
11ca0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 72  e);.    if( !zFr
11cb0 65 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ee ){.      retu
11cc0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
11cd0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
11ce0 6e 61 6d 65 20 3d 20 7a 46 72 65 65 3b 0a 20 20  name = zFree;.  
11cf0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
11d00 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
11d10 4c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  L;.    rc = sqli
11d20 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d 65  te3OsGetTempName
11d30 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
11d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11d60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11d70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Free);.      ret
11d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
11d90 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73  }else{.    flags
11da0 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11db0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 0a 23 69  TEMP_DB;.  }..#i
11dc0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11dd0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
11de0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
11df0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
11e00 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
11e10 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
11e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11e30 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  pen(pVfs, zFilen
11e40 61 6d 65 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67  ame, pFile, flag
11e50 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
11e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
11e70 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  | pFile->pMethod
11e80 73 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  s );.  sqlite3_f
11e90 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 72 65  ree(zFree);.  re
11ea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11eb0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
11ec0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
11ed0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
11ee0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
11ef0 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
11f00 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
11f10 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
11f20 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
11f30 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
11f40 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
11f50 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
11f60 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
11f70 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
11f80 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
11f90 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
11fa0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
11fb0 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
11fc0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
11fd0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
11fe0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
11ff0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
12000 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
12010 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
12020 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
12030 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
12040 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
12050 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
12060 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
12070 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
12080 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
12090 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
120a0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
120b0 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
120c0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
120d0 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
120e0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
120f0 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
12100 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
12110 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12120 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
12130 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
12140 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
12150 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
12160 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
12170 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
12180 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
12190 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
121a0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
121b0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
121c0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
121d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
121e0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
121f0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
12200 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
12210 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
12220 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
12230 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
12260 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
12270 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
12280 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
12290 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
122a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
122b0 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
122c0 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
122d0 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
122e0 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
122f0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
12300 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
12310 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
12320 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
12330 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
12340 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
12350 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  !=0;.  int journ
12360 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
12370 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
12380 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65  pVfs);.  int nDe
12390 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49  faultPage = SQLI
123a0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
123b0 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
123c0 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  athname;.  int n
123d0 50 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  Pathname;..  /* 
123e0 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
123f0 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
12400 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
12410 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
12420 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70  mpute the full p
12430 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 7a 50 61  athname */.  zPa
12440 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
12450 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78  _malloc(pVfs->mx
12460 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
12470 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
12480 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12490 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
124a0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
124b0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
124c0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
124d0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
124e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
124f0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
12500 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
12510 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
12520 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
12530 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
12540 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
12550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12560 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
12570 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  , zFilename, zPa
12580 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
12590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
125a0 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
125b0 70 4e 61 6d 65 28 70 56 66 73 2c 20 7a 50 61 74  pName(pVfs, zPat
125c0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  hname);.  }.  if
125d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
125f0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
12600 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12610 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d   }.  nPathname =
12620 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d   strlen(zPathnam
12630 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
12640 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
12650 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12660 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
12670 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
12680 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
12690 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
126a0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
126b0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75  cture */.    jou
126c0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
126d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
126e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
126f0 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
12700 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
12710 32 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  2 +        /* Th
12720 65 20 64 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f  e db and stmt jo
12730 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
12740 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2a 20      nPathname * 
12750 33 20 2b 20 33 30 20 20 20 20 20 20 20 20 20 20  3 + 30          
12760 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
12770 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
12780 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
12790 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
127a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
127b0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
127c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
127d0 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28  ;.  }.  pPtr = (
127e0 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  u8 *)&pPager[1];
127f0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
12800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
12810 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
12820 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72  ile*0];.  pPager
12830 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65  ->stfd = (sqlite
12840 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
12850 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b  fs->szOsFile*1];
12860 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
12870 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
12880 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
12890 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65  File*2];.  pPage
128a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
128b0 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73  char*)&pPtr[pVfs
128c0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75  ->szOsFile*2+jou
128d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20  rnalFileSize];. 
128e0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
128f0 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
12900 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
12910 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
12920 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
12930 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
12940 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
12950 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
12960 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50  Vfs;.  memcpy(pP
12970 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
12980 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
12990 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69  hname+1);.  sqli
129a0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
129b0 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  me);..  /* Open 
129c0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
129d0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
129e0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
129f0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
12a00 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e  {.    if( nPathn
12a10 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74  ame>(pVfs->mxPat
12a20 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22  hname - sizeof("
12a30 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20  -journal")) ){. 
12a40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12a50 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
12a60 65 6c 73 65 7b 0a 2f 2a 2a 2a 20 20 46 49 58 4d  else{./***  FIXM
12a70 45 3a 20 20 4d 69 67 68 74 20 6e 65 65 64 20 74  E:  Might need t
12a80 6f 20 62 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o be SQLITE_OPEN
12a90 5f 54 45 4d 50 5f 44 42 2e 20 20 4e 65 65 64 20  _TEMP_DB.  Need 
12aa0 74 6f 20 70 61 73 73 20 69 6e 0a 2a 2a 2a 2a 20  to pass in.**** 
12ab0 61 20 66 6c 61 67 20 66 72 6f 6d 20 68 69 67 68  a flag from high
12ac0 65 72 20 75 70 2e 0a 2a 2a 2a 2a 2f 0a 20 20 20  er up..****/.   
12ad0 20 20 20 69 6e 74 20 6f 66 6c 61 67 20 3d 20 0a     int oflag = .
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
12af0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12b00 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
12b10 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
12b20 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 20 20  N_MAIN_DB);.    
12b30 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
12b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12b50 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
12b60 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
12b70 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 6f 66  , pPager->fd, of
12b80 6c 61 67 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  lag, &fout);.   
12b90 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
12ba0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
12bb0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
12bc0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
12bd0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
12be0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
12bf0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
12c00 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20        ** choose 
12c10 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
12c20 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
12c30 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
12c40 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
12c50 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
12c60 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
12c70 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
12c80 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f:.      **.    
12c90 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
12ca0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
12cb0 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ZE,.      **    
12cc0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
12cd0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
12ce0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
12cf0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
12d00 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
12d10 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
12d20 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
12d30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12d50 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
12d60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
12d70 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  SectorSize = sql
12d80 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
12d90 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
12da0 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61 75        if( nDefau
12db0 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72 53 69  ltPage<iSectorSi
12dc0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
12dd0 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69  nDefaultPage = i
12de0 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  SectorSize;.    
12df0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
12e00 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
12e10 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
12e20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
12e30 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
12e40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12e50 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
12e60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
12e70 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
12e80 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
12e90 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
12ea0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
12eb0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
12ec0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
12ed0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
12ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
12ef0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
12f00 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
12f10 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
12f20 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74 50 61  or(ii=nDefaultPa
12f30 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  ge; ii<=SQLITE_M
12f40 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
12f50 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
12f60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12f70 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
12f80 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
12f90 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61 67 65  ) ) nDefaultPage
12fa0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
12fb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
12fc0 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
12fd0 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53 51 4c  nDefaultPage>SQL
12fe0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
12ff0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
13000 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50         nDefaultP
13010 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  age = SQLITE_MAX
13020 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
13030 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
13040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
13050 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62 20 29  lse if( !memDb )
13060 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
13070 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
13080 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
13090 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
130a0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
130b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
130c0 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
130d0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
130e0 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
130f0 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
13100 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
13110 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
13120 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
13130 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
13140 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
13150 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
13160 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20  XCLUSIVE;.  }.. 
13170 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72   if( pPager && r
13180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13190 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
131a0 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
131b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
131c0 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a 20 20  DefaultPage);.  
131d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
131e0 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
131f0 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
13200 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20  cks above..  ** 
13210 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  Free the Pager s
13220 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
13230 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
13240 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  * Since the page
13250 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
13260 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
13270 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
13280 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
13290 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
132a0 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
132b0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d   || !pPager->pTm
132c0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pSpace ){.    sq
132d0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
132e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
132f0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
13300 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
13310 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
13320 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
13330 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
13340 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
13350 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
13360 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
13370 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13380 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
13390 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
133a0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
133b0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20  ilename))..  /* 
133c0 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44  Fill in Pager.zD
133d0 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20  irectory[] */.  
133e0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
133f0 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65  Directory, pPage
13400 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
13410 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f  athname+1);.  fo
13420 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65  r(i=strlen(pPage
13430 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20  r->zDirectory); 
13440 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
13450 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
13460 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
13470 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
13480 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
13490 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  = 0;..  /* Fill 
134a0 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  in Pager.zJourna
134b0 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  l[] */.  memcpy(
134c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
134d0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
134e0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
134f0 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65  .  memcpy(&pPage
13500 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
13510 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
13520 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50  l", 9);..  /* pP
13530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
13540 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
13550 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
13560 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
13570 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
13580 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
13590 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
135a0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
135b0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
135c0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
135d0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
135e0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
135f0 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
13600 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
13610 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
13620 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e 44  r->pageSize = nD
13630 65 66 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a  efaultPage;.  /*
13640 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
13650 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
13660 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
13670 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
13680 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
13690 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
136a0 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50  Page = 100;.  pP
136b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
136c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
136d0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
136e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
136f0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
13700 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
13710 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
13720 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
13730 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
13740 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
13750 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
13760 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
13770 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
13780 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
13790 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
137a0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
137b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
137c0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
137d0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
137e0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
137f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
13800 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
13810 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
13820 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70  usiveMode = temp
13830 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
13840 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
13850 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
13860 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
13870 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
13880 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
13890 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
138a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
138b0 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
138c0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
138d0 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
138e0 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50  oSync?0:1);.  pP
138f0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
13900 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
13910 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
13920 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
13930 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
13940 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
13950 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
13960 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
13970 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
13980 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
13990 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73  NT(nExtra);.  as
139a0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
139b0 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62  >pMethods||memDb
139c0 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ||tempFile);.  i
139d0 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
139e0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
139f0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
13a00 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
13a10 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
13a20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
13a30 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
13a40 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
13a50 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
13a60 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
13a70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13a80 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
13a90 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  NT.  pPager->iIn
13aa0 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61  UseMM = 0;.  pPa
13ab0 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20  ger->iInUseDB = 
13ac0 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  0;.  if( !memDb 
13ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
13ae0 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
13af0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
13b00 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
13b10 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
13b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
13b30 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
13b40 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
13b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13b60 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
13b70 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20  e3PagerList ){. 
13b80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
13b90 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
13ba0 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Prev==0 );.     
13bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13bc0 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65  t->pPrev = pPage
13bd0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  r;.    }.    pPa
13be0 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ger->pPrev = 0;.
13bf0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13c00 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20  List = pPager;. 
13c10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13c20 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20  _leave(mutex);. 
13c30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
13c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13c50 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
13c60 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
13c70 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
13c80 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
13c90 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
13ca0 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
13cb0 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
13cc0 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
13cd0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
13ce0 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
13cf0 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
13d00 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
13d10 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
13d20 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
13d30 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
13d40 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
13d50 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
13d60 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
13d70 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
13d80 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
13d90 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
13da0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
13db0 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
13dc0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
13dd0 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
13de0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
13df0 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
13e00 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
13e10 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
13e20 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
13e30 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
13e40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13e50 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
13e60 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
13e70 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
13e80 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
13e90 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
13ea0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
13eb0 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
13ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
13ed0 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
13ee0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
13ef0 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
13f00 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
13f10 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
13f20 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
13f30 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
13f40 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
13f50 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
13f60 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
13f70 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
13f80 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
13f90 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
13fa0 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
13fb0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
13fc0 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
13fd0 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
13fe0 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
13ff0 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
14000 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
14010 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
14020 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
14030 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
14040 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
14050 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
14060 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
14070 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
14080 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67  ge size to *pPag
14090 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75  eSize. If the su
140a0 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73  ggest new page s
140b0 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72  ize is.** inappr
140c0 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
140d0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
140e0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
140f0 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62   that.** value b
14100 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
14110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14120 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14130 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
14140 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a  16 *pPageSize){.
14150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14160 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65  E_OK;.  u16 page
14170 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
14180 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
14190 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
141a0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
141b0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
141c0 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
141d0 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20  .  if( pageSize 
141e0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
141f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
14200 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65    && !pPager->me
14210 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  mDb && pPager->n
14220 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  Ref==0 .  ){.   
14230 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
14240 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
14250 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
14260 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
14270 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14280 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
14290 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72  lse{.      pager
142a0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
142b0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
142c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
142d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
142e0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
142f0 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
14300 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14310 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
14320 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
14330 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
14340 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
14350 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
14360 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  e(pPager);.    }
14370 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a  .  }.  *pPageSiz
14380 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
14390 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  Size;.  return r
143a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
143b0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
143c0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
143d0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
143e0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
143f0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
14400 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
14410 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
14420 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
14430 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
14440 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
14450 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
14460 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
14470 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
14480 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
14490 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
144a0 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
144b0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
144c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
144d0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
144e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
144f0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
14500 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
14510 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
14520 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  xPage;.  }.  sql
14530 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
14540 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  nt(pPager);.  re
14550 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
14560 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
14570 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
14580 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
14590 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
145a0 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
145b0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
145c0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
145d0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
145e0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
145f0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
14600 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
14610 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
14620 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
14630 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
14640 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
14650 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
14660 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
14670 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
14680 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
14690 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
146a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
146b0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
146c0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
146d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
146e0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
146f0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
14700 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
14710 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
14720 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
14730 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
14740 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
14750 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14760 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
14770 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
14780 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
14790 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
147a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
147b0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
147c0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
147d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
147e0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
147f0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
14800 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
14810 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14820 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
14830 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
14840 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
14850 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
14860 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
14870 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
14880 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
14890 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
148a0 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
148b0 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
148c0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
148d0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
148e0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
148f0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
14900 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
14910 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
14920 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
14930 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
14940 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
14950 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
14960 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
14970 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
14980 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
14990 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
149a0 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
149b0 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
149c0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
149d0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
149e0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
149f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14a00 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
14a10 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
14a20 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
14a30 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
14a40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14a50 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
14a60 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
14a70 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61  ssert(MEMDB||pPa
14a80 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14a90 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
14aa0 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ile);.  if( pPag
14ab0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14ac0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
14ad0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
14ae0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
14af0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b00 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
14b10 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
14b20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14b30 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
14b40 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
14b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14b60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14b80 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
14b90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
14ba0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
14bb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
14bc0 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a  ** pPager. .**.*
14bd0 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47  * If the PENDING
14be0 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68  _BYTE lies on th
14bf0 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20  e page directly 
14c00 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
14c10 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68   the.** file, th
14c20 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  en consider this
14c30 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68   page part of th
14c40 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20  e file too. For 
14c50 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50  example, if.** P
14c60 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62  ENDING_BYTE is b
14c70 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69  yte 4096 (the fi
14c80 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65  rst byte of page
14c90 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65   5) and the size
14ca0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
14cb0 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35  is 4096 bytes, 5
14cc0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
14cd0 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e  tead of 4..*/.in
14ce0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
14cf0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
14d00 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20  Pager){.  i64 n 
14d10 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
14d20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
14d30 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
14d40 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
14d50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14d60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
14d70 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
14d80 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
14d90 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
14da0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
14db0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
14dc0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14dd0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
14de0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14df0 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
14e00 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
14e10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
14e20 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
14e30 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
14e40 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
14e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
14e60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
14e70 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
14e80 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
14e90 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
14ea0 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
14eb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
14ec0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
14ed0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
14ee0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
14ef0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
14f00 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
14f10 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
14f20 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
14f30 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
14f40 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
14f50 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n>pPager->mxPgno
14f60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
14f70 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a  mxPgno = n;.  }.
14f80 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
14f90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14fa0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
14fb0 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
14fc0 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
14fd0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
14fe0 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
14ff0 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
15000 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
15010 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
15020 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53  3_free(pHist->pS
15030 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
15040 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
15050 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
15060 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
15070 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
15080 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
15090 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
150a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
150b0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
150c0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
150d0 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
150e0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
150f0 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
15100 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
15110 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
15120 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
15130 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
15140 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
15150 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
15160 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
15170 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
15180 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
15190 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
151a0 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
151b0 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
151c0 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
151d0 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
151e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
151f0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
15200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
15210 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
15220 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
15230 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
15240 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
15250 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
15260 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
15270 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
15280 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
15290 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
152a0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
152b0 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
152c0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
152d0 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
152e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
152f0 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
15300 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
15310 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
15320 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
15330 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
15340 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
15350 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
15360 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
15370 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
15380 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
15390 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
153a0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
153b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
153c0 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
153d0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
153e0 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
153f0 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
15400 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
15410 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
15420 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
15430 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
15440 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
15450 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
15460 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
15470 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
15480 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
15490 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
154a0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
154b0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
154c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
154d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
154e0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
154f0 20 66 72 65 65 20 70 61 67 65 20 6c 69 73 74 20   free page list 
15500 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  */.  lruListRemo
15510 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55  ve(pPg);..  /* U
15520 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
15530 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
15540 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
15550 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
15560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15570 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
15580 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
15590 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
155a0 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
155b0 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
155c0 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
155d0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
155e0 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
155f0 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
15600 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
15610 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
15620 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
15630 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
15640 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
15650 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
15660 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
15670 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
15680 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
15690 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
156a0 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
156b0 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
156c0 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
156d0 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
156e0 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
156f0 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
15700 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
15710 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
15720 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
15730 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
15740 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
15750 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
15760 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
15770 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
15780 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
15790 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
157a0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
157b0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
157c0 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
157d0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
157e0 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
157f0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
15800 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
15810 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
15820 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
15830 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
15840 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
15850 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
15860 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
15870 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15880 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
15890 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
158a0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
158b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
158c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
158d0 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
158e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
158f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
15900 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
15910 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
15920 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
15930 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
15940 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
15950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15960 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
15970 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
15980 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
15990 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
159a0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
159b0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
159c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
159d0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
159e0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
159f0 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
15a00 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
15a10 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
15a20 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
15a30 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
15a40 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
15a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
15a60 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
15a70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
15a80 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
15a90 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
15aa0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15ab0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
15ac0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15ad0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
15ae0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
15af0 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
15b00 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
15b10 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
15b20 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
15b30 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
15b40 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
15b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
15b60 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
15b70 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
15b80 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
15b90 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
15ba0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
15bb0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
15bc0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
15bd0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
15be0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
15bf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
15c00 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
15c10 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
15c20 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
15c30 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
15c40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15c50 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
15c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
15c80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15c90 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
15ca0 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
15cb0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
15cc0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
15cd0 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
15ce0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
15cf0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
15d00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15d30 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
15d40 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
15d50 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
15d60 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
15d70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
15d90 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
15da0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15db0 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
15dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15dd0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
15de0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
15df0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
15e00 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
15e10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
15e20 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
15e30 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
15e40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15e50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
15e60 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
15e70 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
15e80 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
15e90 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
15ea0 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
15eb0 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
15ec0 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
15ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15ee0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
15ef0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
15f00 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
15f10 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
15f20 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
15f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f40 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  K;.  }.  pagerEn
15f50 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
15f60 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
15f70 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
15f80 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
15f90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15fa0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15fb0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
15fc0 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
15fd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15fe0 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
15ff0 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67  cating. */.  pag
16000 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
16010 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
16020 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16030 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
16040 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  K);.  pagerLeave
16050 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
16060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16070 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
16080 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
16090 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
160a0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
160b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
160c0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
160d0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
160e0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
160f0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
16100 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
16110 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
16120 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
16130 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16140 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
16150 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
16160 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
16170 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
16180 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
16190 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
161a0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
161b0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
161c0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
161d0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
161e0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
161f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
16200 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
16210 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
16220 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
16230 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16240 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
16250 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
16260 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
16270 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
16280 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
16290 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
162a0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
162b0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
162c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
162d0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
162e0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
162f0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
16300 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
16310 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
16320 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
16330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
16340 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16350 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
16360 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44  MENT.  if( !MEMD
16370 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
16380 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
16390 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
163a0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
163b0 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
163c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
163d0 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
163e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
163f0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50  Prev ){.      pP
16400 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  ager->pPrev->pNe
16410 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
16420 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
16430 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
16440 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e  rList = pPager->
16450 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
16460 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65   if( pPager->pNe
16470 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  xt ){.      pPag
16480 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  er->pNext->pPrev
16490 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76   = pPager->pPrev
164a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
164b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
164c0 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
164d0 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
164e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
164f0 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
16500 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
16510 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
16520 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
16530 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
16540 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
16550 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
16560 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
16570 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
16580 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
16590 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
165a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
165b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
165c0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
165d0 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
165e0 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
165f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16600 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
16610 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
16620 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16630 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
16640 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
16650 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
16660 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
16670 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
16680 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
16690 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
166a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
166b0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
166c0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
166d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
166e0 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
166f0 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
16700 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
16710 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
16720 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
16730 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
16740 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
16750 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
16760 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
16770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
16780 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
16790 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
167a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
167b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
167c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
167d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
167e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
167f0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
16800 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
16810 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
16820 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
16830 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
16840 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
16850 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
16860 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
16870 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
16880 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16890 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
168a0 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
168b0 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
168c0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
168d0 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
168e0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
168f0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
16900 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
16910 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
16920 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
16930 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
16940 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
16950 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
16960 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
16970 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
16980 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
16990 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
169a0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
169b0 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
169c0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
169d0 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
169e0 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
169f0 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
16a00 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
16a10 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
16a20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
16a30 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
16a40 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
16a50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
16a60 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
16a70 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
16a80 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
16a90 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65     lruListRemove
16aa0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
16ab0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
16ac0 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
16ad0 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
16ae0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
16af0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
16b00 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
16b10 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
16b20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
16b30 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
16b40 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
16b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
16b60 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
16b70 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
16b80 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
16b90 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
16ba0 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
16bb0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
16bc0 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
16bd0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16be0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
16bf0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
16c00 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
16c10 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
16c20 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
16c30 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
16c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16c50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
16c60 70 50 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74  pPg){.  pagerEnt
16c70 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
16c80 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
16c90 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
16ca0 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72  Pg->pPager);.  r
16cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
16cd0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
16ce0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
16cf0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
16d00 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
16d10 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
16d20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
16d30 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
16d40 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
16d50 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
16d60 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
16d70 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
16d80 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
16d90 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
16da0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
16db0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
16dc0 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
16dd0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
16de0 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
16df0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
16e00 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
16e10 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16e20 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
16e30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
16e40 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
16e50 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
16e60 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
16e70 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
16e80 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
16e90 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
16ea0 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
16eb0 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
16ec0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
16ed0 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
16ee0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
16ef0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
16f00 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
16f10 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
16f20 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
16f30 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
16f40 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
16f50 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
16f60 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
16f70 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
16f80 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
16f90 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
16fa0 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
16fb0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
16fc0 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
16fd0 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
16fe0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
16ff0 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
17000 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
17010 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
17020 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
17030 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
17040 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
17050 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
17060 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
17070 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
17080 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
17090 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
170a0 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
170b0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
170c0 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
170d0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
170e0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
170f0 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
17100 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
17110 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
17120 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
17130 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
17140 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
17150 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
17160 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
17170 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
17180 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
17190 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
171a0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
171b0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
171c0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
171d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
171e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
171f0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79  TE_OK;...  /* Sy
17200 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
17210 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
17220 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
17230 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
17240 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
17250 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
17260 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
17270 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
17280 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
17290 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
172a0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
172b0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
172c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
172d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
172e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
172f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17300 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
17310 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
17320 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
17330 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
17340 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
17350 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
17360 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
17370 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
17380 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
17390 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
173a0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
173b0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
173c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
173d0 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
173e0 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
173f0 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
17400 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
17410 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
17420 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
17430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
17440 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
17450 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
17460 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17470 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
17480 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
17490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
174a0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
174b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
174c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
174d0 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
174e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
174f0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
17500 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
17510 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
17520 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
17530 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
17540 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
17550 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
17560 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
17570 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
17580 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
17590 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
175a0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
175b0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
175c0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
175d0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
175e0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
175f0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
17600 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
17610 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
17620 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
17630 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
17640 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
17650 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
17660 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
17670 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
17680 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
17690 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
176a0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
176b0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
176c0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
176d0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
176e0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
176f0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
17700 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
17710 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
17720 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
17730 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
17740 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
17750 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
17760 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
17770 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
17780 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
17790 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66  lOff;.        if
177a0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
177b0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
177c0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
177d0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
177e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
177f0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
17800 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17810 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
17820 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
17830 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
17840 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
17850 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
17860 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
17870 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
17880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17890 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
178a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
178b0 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d         jrnlOff =
178c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
178d0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
178e0 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
178f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
17900 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
17910 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f  ", pPager, jrnlO
17920 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  ff, 4));.       
17930 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
17940 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
17950 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  rnlOff, pPager->
17960 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
17970 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
17980 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
17990 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
179a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
179b0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
179c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
179d0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
179e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
179f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49  ger));.        I
17a00 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
17a10 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
17a20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17a30 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
17a40 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
17a50 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
17a60 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
17a70 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
17a80 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
17a90 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
17aa0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
17ab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
17ac0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
17ae0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
17af0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17b00 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
17b10 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
17b20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
17b30 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
17b40 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
17b50 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
17b60 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
17b70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
17b80 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
17b90 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
17ba0 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74  }.    lruListSet
17bb0 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
17bc0 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  er);.  }..#ifnde
17bd0 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
17be0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
17bf0 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
17c00 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
17c10 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
17c20 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
17c30 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
17c40 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
17c50 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
17c60 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
17c70 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
17c80 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
17c90 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
17ca0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
17cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17cc0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
17cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
17ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e  rt( pPager->lru.
17cf0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
17d00 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
17d10 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
17d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17d30 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
17d40 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63  lists of pages c
17d50 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
17d60 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f  ty and in pgno o
17d70 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rder..** Do not 
17d80 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20  both fixing the 
17d90 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
17da0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ers..*/.static P
17db0 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65  gHdr *merge_page
17dc0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20  list(PgHdr *pA, 
17dd0 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67  PgHdr *pB){.  Pg
17de0 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61  Hdr result, *pTa
17df0 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72  il;.  pTail = &r
17e00 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20  esult;.  while( 
17e10 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20  pA && pB ){.    
17e20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d  if( pA->pgno<pB-
17e30 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  >pgno ){.      p
17e40 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
17e50 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  A;.      pTail =
17e60 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20   pA;.      pA = 
17e70 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pA->pDirty;.    
17e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
17e90 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
17ea0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
17eb0 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42  B;.      pB = pB
17ec0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
17ed0 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a    }.  if( pA ){.
17ee0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
17ef0 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20  y = pA;.  }else 
17f00 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54  if( pB ){.    pT
17f10 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
17f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17f30 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30  Tail->pDirty = 0
17f40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17f50 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a  esult.pDirty;.}.
17f60 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20  ./*.** Sort the 
17f70 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  list of pages in
17f80 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
17f90 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73   by pgno.  Pages
17fa0 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65   are.** connecte
17fb0 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e  d by pDirty poin
17fc0 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76  ters.  The pPrev
17fd0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61  Dirty pointers a
17fe0 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20  re.** corrupted 
17ff0 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f  by this sort..*/
18000 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
18010 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a  BUCKET_ALLOC 25.
18020 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18030 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23  UCKET       25.#
18040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18050 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
18060 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18070 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65  ket = 0;.  #unde
18080 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a  f N_SORT_BUCKET.
18090 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54    #define N_SORT
180a0 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71  _BUCKET \.   (sq
180b0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
180c0 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65  rt_bucket?sqlite
180d0 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
180e0 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43  ucket:N_SORT_BUC
180f0 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69  KET_ALLOC).#endi
18100 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  f.static PgHdr *
18110 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
18120 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
18130 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
18140 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a  KET_ALLOC], *p;.
18150 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
18160 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
18170 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
18180 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
18190 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
181a0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
181b0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
181c0 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
181d0 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
181e0 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
181f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
18200 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
18210 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
18220 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
18230 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
18240 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
18250 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
18260 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
18270 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
18280 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1 ){.      /* Co
18290 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68  verage: To get h
182a0 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20  ere, there need 
182b0 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f  to be 2^(N_SORT_
182c0 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a  BUCKET) .      *
182d0 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
182e0 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68  e input list. Th
182f0 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  is is possible, 
18300 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e  but impractical.
18310 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e  .      ** Testin
18320 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74  g this line is t
18330 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62  he point of glob
18340 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
18350 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67    ** sqlite3_pag
18360 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
18370 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18380 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
18390 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
183a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
183b0 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
183c0 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
183d0 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
183e0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
183f0 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
18400 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
18410 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
18420 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
18430 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
18440 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
18450 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
18460 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
18470 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
18480 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
18490 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
184a0 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
184b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
184c0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
184d0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
184e0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
184f0 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20  PgHdr *p;.  int 
18500 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
18510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18520 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
18530 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
18540 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
18550 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
18560 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
18570 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
18580 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
18590 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
185a0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
185b0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
185c0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
185d0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
185e0 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
185f0 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
18600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
18610 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
18620 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
18630 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
18640 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
18650 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
18660 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
18670 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
18680 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
18690 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
186a0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
186b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
186c0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
186d0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
186e0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
186f0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
18700 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
18710 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
18720 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
18730 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
18740 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
18750 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
18760 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
18770 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
18780 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
18790 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
187a0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
187b0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
187c0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
187d0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
187e0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
187f0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
18800 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
18810 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
18820 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
18830 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
18840 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
18850 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
18860 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
18870 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
18880 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
18890 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
188a0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
188b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
188c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
188d0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
188e0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
188f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18900 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18910 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
18920 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
18930 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  t);.  for(p=pLis
18940 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
18950 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
18960 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  p->dirty );.    
18970 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
18980 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  }.  while( pList
18990 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
189a0 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
189b0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
189c0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
189d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
189e0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
189f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  {.      assert(p
18a00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
18a10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18a20 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
18a30 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  p(pPager->pVfs, 
18a40 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
18a50 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
18a60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
18a70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18a80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
18a90 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
18aa0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
18ab0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
18ac0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
18ad0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
18ae0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
18af0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
18b00 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
18b10 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
18b20 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
18b30 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
18b40 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
18b50 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
18b60 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
18b70 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
18b80 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
18b90 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
18ba0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
18bb0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
18bc0 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
18bd0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
18be0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
18bf0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
18c00 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
18c10 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
18c20 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
18c30 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
18c40 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
18c50 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
18c60 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
18c80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
18c90 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
18ca0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
18cb0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
18cc0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
18cd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
18ce0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
18cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18d00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18d10 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
18d20 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
18d30 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
18d40 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
18d50 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
18d60 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
18d70 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
18d80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
18d90 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
18da0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
18db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18dc0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
18dd0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
18de0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
18df0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
18e00 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
18e10 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
18e20 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
18e30 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
18e40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
18e50 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
18e60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
18e70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18e80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18e90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
18ea0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
18eb0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
18ec0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
18ed0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
18ee0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
18ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
18f10 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
18f20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
18f30 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
18f40 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18f50 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
18f60 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
18f70 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
18f80 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
18f90 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
18fa0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
18fb0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
18fc0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
18fd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18fe0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18ff0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
19000 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19010 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
19020 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
19030 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
19040 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
19050 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
19060 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
19070 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
19080 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
19090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
190a0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
190b0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
190c0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
190d0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
190e0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
190f0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
19100 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
19110 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
19120 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
19130 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
19140 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
19150 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19160 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19170 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19180 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
19190 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
191a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
191b0 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
191c0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
191d0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
191e0 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
191f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19200 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
19210 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
19220 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
19230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19250 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
19260 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
19270 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
19280 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
19290 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
192a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
192b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
192c0 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
192d0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
192e0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
192f0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
19300 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
19310 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
19320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19330 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
19340 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
19350 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
19360 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
19370 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
19380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19390 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
193a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
193b0 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
193c0 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
193d0 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
193e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  ;..  assert(!MEM
193f0 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  DB);..  /* Find 
19400 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
19410 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
19420 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
19430 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
19440 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
19450 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
19460 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
19470 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
19480 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  .pFirstSynced;..
19490 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
194a0 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
194b0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
194c0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
194d0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
194e0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
194f0 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
19500 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
19510 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
19520 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
19530 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
19540 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
19550 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
19560 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
19570 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
19580 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6c  ==0 && pPager->l
19590 72 75 2e 70 46 69 72 73 74 20 26 26 20 73 79 6e  ru.pFirst && syn
195a0 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
195b0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
195c0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
195d0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
195e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e  ger->fd);.    in
195f0 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
19600 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
19610 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
19620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19630 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
19640 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
19650 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
19660 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
19670 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
19680 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
19690 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20  de, write a new 
196a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
196b0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
196c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
196d0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
196e0 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
196f0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  ing a journal.  
19700 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
19710 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
19720 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
19730 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
19740 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  e.      ** alrea
19750 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
19760 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19770 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
19780 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  der is.      ** 
19790 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
197a0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
197b0 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a  pdated)..      *
197c0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
197d0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
197e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
197f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
19800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19810 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
19820 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  c==0 );.      rc
19830 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
19840 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
19850 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
19860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19880 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
19890 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20 20  ->lru.pFirst;.  
198a0 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
198b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
198c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
198d0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
198e0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
198f0 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
19900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19910 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
19920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
19930 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e  >dirty ){.    in
19940 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
19950 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
19960 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  =0 );.    makeCl
19970 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
19980 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
19990 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
199a0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
199b0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
199c0 28 20 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ( pPg );.    pPg
199d0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
199e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
199f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19a00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
19a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
19a20 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  dirty==0 );..  /
19a30 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
19a40 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
19a50 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
19a60 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
19a70 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c  .  ** set the gl
19a80 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
19a90 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
19aa0 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a  isabling the.  *
19ab0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
19ac0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  ntRollback() opt
19ad0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
19ae0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
19af0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
19b00 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
19b10 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61   to do this beca
19b20 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72  use the page mar
19b30 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
19b40 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ck.  ** might be
19b50 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
19b60 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
19b70 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
19b80 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
19b90 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
19ba0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
19bb0 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
19bc0 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
19bd0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61   must.  ** be ma
19be0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
19bf0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
19c00 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20   on out..  */.  
19c10 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
19c20 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49  ollback ){.    I
19c30 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f  OTRACE(("ALWAYS_
19c40 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20  ROLLBACK %p\n", 
19c50 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61  pPager)).    pPa
19c60 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
19c70 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
19c80 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
19c90 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
19ca0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
19cb0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
19cc0 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
19cd0 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg);.  assert( p
19ce0 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a  Pg->pgno==0 );..
19cf0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20    *ppPg = pPg;. 
19d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19d10 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
19d20 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
19d30 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a  Y_MANAGEMENT./*.
19d40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19d50 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
19d60 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
19d70 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
19d80 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
19d90 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
19da0 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
19db0 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
19dc0 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
19dd0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
19de0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
19df0 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65  y be sqlite3_fre
19e00 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
19e10 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
19e20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
19e30 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
19e40 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
19e50 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
19e60 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
19e70 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75  eturns. The retu
19e80 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
19e90 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
19ea0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
19eb0 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
19ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
19ed0 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
19ee0 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20  nt nReq){.  int 
19ef0 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 20 20  nReleased = 0;  
19f00 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
19f10 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
19f20 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
19f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
19f40 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a 20 54  utex;       /* T
19f50 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f  he MEM2 mutex */
19f60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
19f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19f80 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
19f90 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20 20 69  er pagers */.  i
19fa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19fb0 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65  K;..  /* Acquire
19fc0 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61   the memory-mana
19fd0 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a  gement mutex.  *
19fe0 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  /.  mutex = sqli
19ff0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1a000 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1a010 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c  TIC_MEM2);.  sql
1a020 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1a030 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  (mutex);..  /* S
1a040 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61  ignal all databa
1a050 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1a060 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  hat memory manag
1a070 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a  ement wants.  **
1a080 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 20   to have access 
1a090 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20  to the pagers.. 
1a0a0 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1a0b0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1a0c0 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1a0d0 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1a0e0 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1a0f0 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d  InUseMM = 1;.  }
1a100 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1a110 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65  QLITE_OK && (nRe
1a120 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
1a130 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67  <nReq) ){.    Pg
1a140 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67  Hdr *pPg;.    Pg
1a150 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a  Hdr *pRecycled;.
1a160 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20   .    /* Try to 
1a170 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  find a page to r
1a180 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73  ecycle that does
1a190 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 73   not require a s
1a1a0 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ync(). If.    **
1a1b0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
1a1c0 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20  sible, find one 
1a1d0 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69 72  that does requir
1a1e0 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20  e a sync()..    
1a1f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  */.    sqlite3_m
1a200 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1a210 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1a220 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1a230 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50  IC_LRU));.    pP
1a240 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1a250 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
1a260 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ced;.    while( 
1a270 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65  pPg && (pPg->nee
1a280 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50  dSync || pPg->pP
1a290 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20  ager->iInUseDB) 
1a2a0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  ){.      pPg = p
1a2b0 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1a2c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1a2d0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67  pPg ){.      pPg
1a2e0 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1a2f0 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20  eList.pFirst;.  
1a300 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1a310 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  & pPg->pPager->i
1a320 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20  InUseDB ){.     
1a330 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1a340 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ree.pNext;.     
1a350 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1a360 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a370 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1a380 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1a390 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1a3a0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d  .    /* If pPg==
1a3b0 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63  0, then the bloc
1a3c0 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c  k above has fail
1a3d0 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ed to find a pag
1a3e0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79  e to.    ** recy
1a3f0 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  cle. In this cas
1a400 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d  e return early -
1a410 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f   no further memo
1a420 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ry will.    ** b
1a430 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
1a440 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20  */.    if( !pPg 
1a450 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50  ) break;..    pP
1a460 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1a470 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21  er;.    assert(!
1a480 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1a490 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1a4a0 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61  u.pFirst);.    a
1a4b0 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53  ssert(pPg->needS
1a4c0 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1a4d0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1a4e0 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 72 63  nced);.  .    rc
1a4f0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
1a500 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 52 65  (pPager, 1, &pRe
1a510 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 61 73 73  cycled);.    ass
1a520 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70  ert(pRecycled==p
1a530 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  Pg || rc!=SQLITE
1a540 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  _OK);.    if( rc
1a550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a560 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f       /* We've fo
1a570 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72  und a page to fr
1a580 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  ee. At this poin
1a590 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  t the page has b
1a5a0 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  een .      ** re
1a5b0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
1a5c0 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
1a5d0 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
1a5e0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
1a5f0 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
1a600 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
1a610 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
1a620 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
1a630 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
1a640 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
1a650 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
1a660 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1a670 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
1a680 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
1a690 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
1a6a0 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
1a6b0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
1a6c0 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
1a6d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48      */.      PgH
1a6e0 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  dr *pTmp;.      
1a6f0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
1a700 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50       if( pPg==pP
1a710 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
1a720 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1a730 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
1a740 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  All;.      }else
1a750 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 70  {.        for( p
1a760 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Tmp=pPager->pAll
1a770 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
1a780 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
1a790 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
1a7a0 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65         pTmp->pNe
1a7b0 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  xtAll = pPg->pNe
1a7c0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  xtAll;.      }. 
1a7d0 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b       nReleased +
1a7e0 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73 69  = (.          si
1a7f0 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
1a800 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->pageSize.  
1a810 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
1a820 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
1a830 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
1a840 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
1a850 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20  PgHistory) .    
1a860 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41    );.      IOTRA
1a870 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
1a880 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  d *\n", pPager, 
1a890 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
1a8a0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1a8b0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
1a8c0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
1a8d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1a8e0 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
1a8f0 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
1a900 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1a910 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
1a920 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
1a930 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1a940 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a  ile or .      **
1a950 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65   journal in page
1a960 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65  r_recycle(). The
1a970 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65   error is not re
1a980 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20  turned to the . 
1a990 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f       ** caller o
1a9a0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
1a9b0 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68   Instead, set th
1a9c0 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
1a9d0 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20  variable..      
1a9e0 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c  ** The error wil
1a9f0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
1aa00 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73   the user (or us
1aa10 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65  ers, in the case
1aa20 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20   .      ** of a 
1aa30 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63  shared pager cac
1aa40 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72  he) of the pager
1aa50 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65   for which the e
1aa60 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20  rror occured..  
1aa70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
1aa80 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20 28  ert(.          (
1aa90 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
1aaa0 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20 20  _IOERR ||.      
1aab0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46      rc==SQLITE_F
1aac0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ULL ||.         
1aad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1aae0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1aaf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ab00 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1ab10 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 70  ERVED );.      p
1ab20 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1ab30 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  r, rc);.    }.  
1ab40 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68  }..  /* Clear th
1ab50 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  e memory managem
1ab60 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72 65  ent flags and re
1ab70 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78 0a  lease the mutex.
1ab80 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65    */.  for(pPage
1ab90 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  r=sqlite3PagerLi
1aba0 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67  st; pPager; pPag
1abb0 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
1abc0 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ){.     pPager->
1abd0 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20  iInUseMM = 0;.  
1abe0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1abf0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a  x_leave(mutex);.
1ac00 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
1ac10 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1ac20 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20   released.  */. 
1ac30 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65   return nRelease
1ac40 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
1ac50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1ac60 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a  ORY_MANAGEMENT *
1ac70 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
1ac80 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
1ac90 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1aca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1acb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1acc0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
1acd0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
1ace0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
1acf0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20    int rc;.  i64 
1ad00 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74  offset;.  assert
1ad10 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
1ad20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
1ad30 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
1ad40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
1ad50 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
1ad60 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1ad70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ad80 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1ad90 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  D;.  }.  offset 
1ada0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1adb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1adc0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1add0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1ade0 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
1adf0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1ae00 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1ae10 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
1ae20 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1ae30 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1ae40 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1ae50 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1ae60 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1ae70 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1ae80 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  ));.  if( pgno==
1ae90 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
1aea0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1aeb0 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
1aec0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
1aed0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
1af10 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1af20 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1af30 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
1af40 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
1af50 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54  no, 3);.  PAGERT
1af60 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20  RACE4("FETCH %d 
1af70 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1af80 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1af90 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1afa0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1afb0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1afc0 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  (pPg));.  return
1afd0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1afe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1aff0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1b000 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1b010 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1b020 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
1b030 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
1b040 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
1b050 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
1b060 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
1b070 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
1b080 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1b090 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
1b0a0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
1b0b0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
1b0c0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
1b0d0 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
1b0e0 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
1b0f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
1b100 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
1b110 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
1b120 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
1b130 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
1b140 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
1b150 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
1b160 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
1b170 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1b180 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1b190 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b1a0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1b1b0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1b1c0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1b1d0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
1b1e0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
1b1f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b200 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  r->nRef==0 );.  
1b210 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1b220 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
1b230 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1b240 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1b250 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
1b260 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
1b270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b280 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1b290 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1b2a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1b2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1b2c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b2d0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
1b2e0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20   );.      }.  . 
1b2f0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75       /* If a jou
1b300 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
1b310 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
1b320 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
1b330 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  on the.      ** 
1b340 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1b350 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
1b360 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
1b370 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
1b380 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b390 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e   if( hasHotJourn
1b3a0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1b3b0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1b3c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1b3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b3e0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1b3f0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1b400 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1b410 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1b420 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1b430 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1b440 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1b450 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1b460 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1b470 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1b480 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1b490 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1b4a0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1b4b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1b4c0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1b4d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1b4e0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1b4f0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1b500 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1b510 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1b520 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1b530 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1b540 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1b550 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1b560 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1b570 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1b580 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1b590 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1b5a0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1b5b0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1b5c0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1b5d0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1b5e0 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53   it's own EXCLUS
1b5f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b600 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1b610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b630 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1b640 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1b650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b670 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
1b680 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1b690 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b6a0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1b6b0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1b6c0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1b6d0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1b6e0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20  _EXCLUSIVE;. .  
1b6f0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
1b700 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
1b710 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
1b720 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1b730 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  if.        ** we
1b740 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
1b750 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1b760 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  file. .        *
1b770 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
1b780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1b790 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b7a0 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e  e locked itself.
1b7b0 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1b7c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1b7d0 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65   never open unle
1b7e0 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ss the main data
1b7f0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a  base file holds.
1b800 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69          ** a wri
1b810 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
1b820 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
1b830 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
1b840 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  more.        ** 
1b850 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
1b860 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
1b870 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
1b880 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1b890 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a     ** Open the j
1b8a0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
1b8b0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
1b8c0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
1b8d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63   .        ** exc
1b8e0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1b8f0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
1b900 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
1b910 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
1b920 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79       ** possibly
1b930 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
1b940 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
1b950 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  . On some system
1b960 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  s, the.        *
1b970 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
1b980 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
1b990 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
1b9a0 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
1b9b0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61          ** a rea
1b9c0 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
1b9d0 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dle..        */.
1b9e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b9f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1ba00 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
1ba10 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
1ba20 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
1ba30 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1ba40 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TS) ){.         
1ba50 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
1ba60 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61           int fla
1ba70 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
1ba80 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1ba90 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1baa0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61  NAL;.          a
1bab0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1bac0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1bad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bae0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1baf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1bb00 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
1bb10 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
1bb20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1bb30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1bb40 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1bb50 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
1bb60 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49     if( fout&SQLI
1bb70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1bb80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bb90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1bba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1bbb0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1bbc0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
1bbd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bbe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1bbf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bc00 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
1bc10 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1bc20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
1bc30 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1bc40 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59 29  ?rc:SQLITE_BUSY)
1bc50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bc60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1bc70 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
1bc80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1bc90 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1bca0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bcb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1bcc0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bcd0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1bce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bcf0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1bd00 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61   .        /* Pla
1bd10 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
1bd20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
1bd30 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
1bd40 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
1bd50 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
1bd60 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
1bd70 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
1bd80 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1bd90 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1bda0 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 1);.        i
1bdb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bdc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1bdd0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1bde0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be00 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73  assert(pPager->s
1be10 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1be20 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ED || .         
1be30 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c     (pPager->excl
1be40 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
1be50 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
1be60 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1be70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
1be80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
1be90 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  All ){.        /
1bea0 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
1beb0 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
1bec0 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
1bed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1bee0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
1bef0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
1bf00 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1bf10 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
1bf20 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  us.        ** re
1bf30 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1bf40 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
1bf50 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
1bf60 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
1bf70 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
1bf80 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
1bf90 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
1bfa0 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
1bfb0 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
1bfc0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1bfd0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
1bfe0 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
1bff0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
1c000 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
1c010 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
1c020 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
1c030 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
1c040 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
1c050 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
1c060 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
1c070 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
1c080 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
1c090 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
1c0a0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
1c0b0 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
1c0c0 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
1c0d0 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
1c0e0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  e when.        *
1c0f0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
1c100 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  use..        ** 
1c110 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72  .        ** Ther
1c120 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
1c130 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
1c140 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
1c150 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
1c160 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
1c170 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
1c180 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
1c190 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
1c1a0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
1c1b0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
1c1c0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
1c1d0 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46          char dbF
1c1e0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
1c1f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c200 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s)];.        sql
1c210 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c220 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  nt(pPager);..   
1c230 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c240 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1c250 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61        return pPa
1c260 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c270 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1c280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c290 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
1c2a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
1c2b0 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
1c2c0 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
1c2d0 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
1c2e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c2f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1c300 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
1c310 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1c320 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
1c330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c350 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c380 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
1c390 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
1c3a0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
1c3b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1c3c0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
1c3d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c3e0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1c3f0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1c400 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
1c410 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1c420 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c430 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c440 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c450 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1c460 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
1c470 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te<=PAGER_SHARED
1c480 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1c490 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1c4a0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
1c4b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1c4c0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1c4d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1c4e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c4f0 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72  Allocate a PgHdr
1c500 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65   object.   Eithe
1c510 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  r create a new o
1c520 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61  ne or reuse.** a
1c530 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74  n existing one t
1c540 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  hat is not other
1c550 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  wise in use..**.
1c560 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73  ** A new PgHdr s
1c570 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
1c580 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ted if any of th
1c590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a  e following are.
1c5a0 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** true:.**.**  
1c5b0 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
1c5c0 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72  not exceeded our
1c5d0 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   maximum allocat
1c5e0 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  ed cache size.**
1c5f0 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74            as set
1c600 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20   by the "PRAGMA 
1c610 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d  cache_size" comm
1c620 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  and..**.**     (
1c630 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  2)  There are no
1c640 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62   unused PgHdr ob
1c650 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20  jects available 
1c660 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a  at this time..**
1c670 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69  .**     (3)  Thi
1c680 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1c690 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
1c6a0 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65  *     (4)  There
1c6b0 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62   are no PgHdr ob
1c6c0 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  jects that do no
1c6d0 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  t require a jour
1c6e0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
1c6f0 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20  file sync and a 
1c700 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72  sync of the jour
1c710 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72  nal file is curr
1c720 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
1c730 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a    prohibited..**
1c740 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
1c750 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
1c760 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65   PgHdr.  In othe
1c770 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61  r words, reuse a
1c780 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67  n.** existing Pg
1c790 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  Hdr if all of th
1c7a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1c7b0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1c7c0 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61  (1)  We have rea
1c7d0 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64  ched or exceeded
1c7e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63   the maximum cac
1c7f0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1c800 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22      allowed by "
1c810 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1c820 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  e"..**.**     (2
1c830 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67  )  There is a Pg
1c840 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69  Hdr available wi
1c850 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d  th PgHdr->nRef==
1c860 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  0.**.**     (3) 
1c870 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61   We are not in a
1c880 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1c890 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  base.**.**     (
1c8a0 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65  4)  Either there
1c8b0 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65   is an available
1c8c0 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73   PgHdr that does
1c8d0 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20   not need.**    
1c8e0 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63        to be sync
1c8f0 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c  ed to disk or el
1c900 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20  se disk syncing 
1c910 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1c920 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
1c930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c940 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1c950 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1c960 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
1c970 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c980 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
1c990 50 67 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  Pg;..  /* Create
1c9a0 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20   a new PgHdr if 
1c9b0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20  any of the four 
1c9c0 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e  conditions defin
1c9d0 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61  ed .  ** above a
1c9e0 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28  re met: */.  if(
1c9f0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
1ca00 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20  Pager->mxPage.  
1ca10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e   || pPager->lru.
1ca20 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c  pFirst==0 .   ||
1ca30 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50   MEMDB.   || (pP
1ca40 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1ca50 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
1ca60 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
1ca70 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
1ca80 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1ca90 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1caa0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1cab0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1cac0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1cad0 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1cae0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1caf0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1cb00 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1cb10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1cb20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1cb30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1cb40 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1cb50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cb60 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1cb70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 67 20  Pager);.    pPg 
1cb80 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1cb90 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
1cba0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cbb0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1cbd0 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
1cbe0 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc00 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
1cc10 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
1cc20 79 29 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45  y) );.    pagerE
1cc30 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1cc40 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1cc50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cc60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1cc70 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1cc80 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1cc90 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
1cca0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a   sizeof(*pPg));.
1ccb0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1ccc0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1ccd0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1cce0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
1ccf0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
1cd00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
1cd10 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
1cd20 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
1cd30 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
1cd40 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
1cd50 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
1cd60 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
1cd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1cd80 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
1cd90 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
1cda0 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
1cdb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1cdc0 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1cdd0 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , 1, &pPg);.    
1cde0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
1cdf0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
1ce00 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
1ce10 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
1ce20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
1ce40 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1ce50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1ce60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ce70 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1ce80 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1ce90 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1cea0 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
1ceb0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
1cec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ced0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
1cee0 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
1cef0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
1cf00 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
1cf10 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
1cf20 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1cf30 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
1cf40 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
1cf50 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
1cf60 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
1cf70 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
1cf80 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
1cf90 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
1cfa0 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
1cfb0 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
1cfc0 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
1cfd0 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
1cfe0 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
1cff0 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
1d000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d010 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1d020 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
1d030 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
1d040 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
1d050 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1d060 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
1d070 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d090 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
1d0a0 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1d0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d0c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d0d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d0e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d0f0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
1d100 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
1d110 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
1d120 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
1d130 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
1d140 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
1d150 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
1d160 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1d170 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1d180 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1d190 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d1a0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1d1b0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1d1c0 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1d1d0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d1e0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1d1f0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1d200 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1d210 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1d220 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1d230 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1d240 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1d250 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1d260 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1d270 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1d280 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1d290 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1d2a0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1d2b0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1d2c0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1d2d0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1d2e0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1d2f0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1d300 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1d310 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1d320 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1d330 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1d340 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1d350 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1d360 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1d370 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1d380 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1d390 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1d3a0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1d3b0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1d3c0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1d3d0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1d3e0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1d3f0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1d400 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1d410 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1d420 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1d430 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1d440 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1d450 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1d460 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1d470 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1d480 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1d490 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1d4a0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1d4b0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1d4c0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1d4d0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1d4e0 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1d4f0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1d500 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1d510 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1d520 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1d530 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1d540 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1d550 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1d560 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1d570 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1d580 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1d590 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1d5a0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1d5b0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1d5c0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1d5d0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1d5e0 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1d5f0 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1d600 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1d610 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1d620 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1d630 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1d640 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1d650 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1d660 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1d670 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1d680 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1d690 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1d6a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d6b0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1d6c0 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1d6d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1d6e0 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1d6f0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1d700 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1d710 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1d720 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1d730 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1d740 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1d750 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
1d760 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
1d770 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1d780 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1d790 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1d7a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d7b0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1d7c0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1d7d0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1d7e0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1d7f0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1d800 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1d810 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1d820 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1d830 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1d840 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1d850 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1d860 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1d870 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1d880 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1d890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1d8a0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1d8b0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1d8c0 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1d8d0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1d8e0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1d8f0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1d900 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1d910 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1d920 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1d930 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1d940 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1d950 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1d960 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1d970 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1d980 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1d990 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1d9a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d9b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1d9c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1d9d0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1d9e0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1d9f0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1da00 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1da10 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1da20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1da30 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1da40 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1da50 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1da60 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1da70 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
1da80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1da90 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1daa0 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1dab0 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1dac0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1dad0 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1dae0 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1daf0 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1db00 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1db10 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1db20 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1db30 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1db40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1db50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1db60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1db70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1db80 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1db90 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
1dba0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1dbb0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1dbc0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
1dbd0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1dbe0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
1dbf0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1dc00 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
1dc10 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47    int h;.    PAG
1dc20 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dc30 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d  nMiss);.    rc =
1dc40 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1dc50 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  ge(pPager, &pPg)
1dc60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1dc70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1dc90 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  }..    pPg->pgno
1dca0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73   = pgno;.    ass
1dcb0 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
1dcc0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74  gno>pPager->stmt
1dcd0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1dce0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1dcf0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
1dd00 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1dd10 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  ize ){.#if 0.   
1dd20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
1dd30 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
1dd40 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
1dd50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1dd60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dd70 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1dd80 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1dd90 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1dda0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
1ddb0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
1ddc0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
1ddd0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1dde0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ddf0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1de00 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1de10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1de20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65    }..    makeCle
1de30 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
1de40 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1de50 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1de60 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
1de70 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
1de80 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
1de90 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1dea0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
1deb0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
1dec0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
1ded0 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
1dee0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1def0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1df00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1df10 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Code ){.      sq
1df20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1df30 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pPg);.      rc =
1df40 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1df50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1df60 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1df70 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
1df80 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
1df90 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
1dfa0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dfb0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
1dfc0 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1dfd0 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
1dfe0 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1dff0 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1e000 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1e010 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
1e020 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1e030 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
1e040 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1e050 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
1e060 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e070 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1e080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e090 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
1e0a0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1e0b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1e0c0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1e0d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
1e0e0 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
1e0f0 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
1e100 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e110 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1e120 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
1e130 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1e140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e150 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1e160 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
1e170 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1e180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1e190 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1e1a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1e1b0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
1e1c0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
1e1d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e1e0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1e1f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e200 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
1e210 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1e220 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1e230 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1e240 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
1e250 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
1e260 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1e270 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
1e280 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
1e290 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1e2a0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1e2b0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
1e2c0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1e2d0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
1e2e0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
1e2f0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
1e300 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1e310 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
1e320 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1e330 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1e340 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e350 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e360 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1e370 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1e380 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1e390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1e3a0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1e3b0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
1e3c0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
1e3d0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1e3e0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1e3f0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1e400 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1e410 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1e420 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1e430 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1e440 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1e450 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e460 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e470 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e480 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1e490 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1e4a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e4b0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1e4c0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
1e4d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e4e0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1e4f0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
1e500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e510 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
1e520 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1e530 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
1e540 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
1e550 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
1e560 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e570 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
1e580 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
1e590 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
1e5a0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
1e5b0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
1e5c0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1e5d0 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
1e5e0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1e5f0 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
1e600 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
1e610 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
1e620 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  t);.  pagerLeave
1e630 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1e640 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1e650 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1e660 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1e670 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e680 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1e690 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1e6a0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1e6b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e6c0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1e6d0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1e6e0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1e6f0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1e700 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1e710 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1e720 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1e730 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1e740 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1e750 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1e760 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1e770 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1e780 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1e790 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1e7a0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1e7b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1e7c0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1e7d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1e7e0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1e7f0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1e800 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1e810 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1e820 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1e830 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1e840 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1e850 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1e860 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1e870 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1e880 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1e890 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
1e8a0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
1e8b0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1e8c0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1e8d0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1e8e0 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
1e8f0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1e900 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1e910 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1e920 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1e930 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1e940 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
1e950 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ing */.  }else i
1e960 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f  f( (pPg = pager_
1e970 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1e980 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gno))!=0 ){.    
1e990 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1e9a0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
1e9b0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1e9c0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
1e9d0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
1e9e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
1e9f0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1ea00 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
1ea10 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
1ea20 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
1ea30 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
1ea40 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
1ea50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1ea60 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
1ea70 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
1ea80 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
1ea90 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
1eaa0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
1eab0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
1eac0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ead0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
1eae0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1eaf0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1eb00 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
1eb10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1eb20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1eb30 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d   pagerEnter(pPg-
1eb40 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d  >pPager);.  pPg-
1eb50 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
1eb60 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
1eb70 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1eb80 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
1eb90 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1eba0 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
1ebb0 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
1ebc0 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
1ebd0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
1ebe0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
1ebf0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
1ec00 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
1ec10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1ec20 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 20 20  g->pPager;..    
1ec30 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
1ec40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ec50 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
1ec60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
1ec70 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
1ec80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1ec90 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1eca0 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
1ecb0 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
1ecc0 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
1ecd0 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
1ece0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1ecf0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1ed00 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
1ed10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ed20 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
1ed30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ed40 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
1ed50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1ed60 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
1ed70 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
1ed80 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
1ed90 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1eda0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1edb0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
1edc0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
1edd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ede0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1edf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1ee00 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
1ee10 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1ee20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
1ee30 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1ee40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ee50 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
1ee60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ee70 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
1ee80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
1ee90 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
1eea0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1eeb0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1eec0 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
1eed0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1eee0 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1eef0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
1ef00 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
1ef10 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1ef20 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1ef30 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
1ef40 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1ef50 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1ef60 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
1ef70 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
1ef80 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69  EN_CREATE);..  i
1ef90 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1efa0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1efb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1efc0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1efd0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
1efe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1eff0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
1f000 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
1f010 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
1f020 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1f030 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
1f040 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1f050 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1f060 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1f070 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
1f080 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1f090 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50  e3MallocZero( pP
1f0a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1f0b0 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74   1 );.  pagerEnt
1f0c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
1f0d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1f0e0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
1f0f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1f100 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1f110 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1f120 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
1f130 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1f140 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28  {.    flags |= (
1f150 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1f160 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
1f170 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1f180 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AL);.  }else{.  
1f190 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1f1a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1f1b0 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65  RNAL);.  }.#ifde
1f1c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f1d0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 72  ATOMIC_WRITE.  r
1f1e0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
1f1f0 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 70 56  alOpen(.      pV
1f200 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1f210 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1f220 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
1f230 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
1f240 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63  .  );.#else.  rc
1f250 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1f260 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1f270 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1f280 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
1f290 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
1f2a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f2b0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1f2c0 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 70 50  pMethods );.  pP
1f2d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f2e0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1f2f0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1f300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f310 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1f320 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f340 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1f350 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1f360 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
1f370 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
1f380 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69    }.    goto fai
1f390 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1f3a0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1f3b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1f3c0 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
1f3d0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1f3e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
1f3f0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
1f400 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1f410 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
1f420 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1f430 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f440 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1f450 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1f460 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1f470 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1f480 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
1f490 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1f4a0 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1f4b0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1f4c0 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1f4d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
1f4e0 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
1f4f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f510 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
1f520 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1f530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1f540 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
1f550 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1f560 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1f570 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
1f580 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f5a0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1f5b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1f5c0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
1f5d0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
1f5e0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1f5f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
1f600 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1f610 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1f620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f630 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1f640 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1f650 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1f660 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1f670 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1f680 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1f690 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1f6a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f6b0 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1f6c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1f6d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f6e0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1f6f0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1f700 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1f710 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1f720 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1f730 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1f740 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1f750 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1f760 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1f770 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1f780 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1f790 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1f7a0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1f7b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1f7c0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1f7d0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1f7e0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1f7f0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1f800 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f810 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1f820 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1f830 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1f840 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1f850 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1f860 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1f870 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1f880 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1f890 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1f8a0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1f8b0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1f8c0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1f8d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1f8e0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1f8f0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1f900 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1f910 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1f920 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1f930 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1f940 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1f950 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1f960 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1f970 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1f980 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1f990 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1f9a0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1f9b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1f9c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1f9d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1f9e0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1f9f0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1fa00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1fa10 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1fa20 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1fa30 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1fa40 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1fa50 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1fa60 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1fa70 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1fa80 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1fa90 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1faa0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1fab0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1fac0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1fad0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1fae0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1faf0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1fb00 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1fb10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1fb20 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1fb30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
1fb40 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1fb50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1fb60 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1fb70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1fb80 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1fb90 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1fba0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1fbb0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1fbc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1fbd0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1fbe0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1fbf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1fc00 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1fc10 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
1fc20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1fc30 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1fc40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fc50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fc60 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1fc70 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1fc80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fca0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1fcb0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
1fcc0 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
1fcd0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1fce0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1fcf0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1fd00 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1fd10 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
1fd20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1fd30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fd40 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
1fd50 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1fd60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fd70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fd80 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1fd90 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41  he = 0;.      PA
1fda0 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53  GERTRACE2("TRANS
1fdb0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
1fdc0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1fdd0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1fde0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
1fdf0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1fe00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1fe10 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1fe20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1fe30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1fe40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1fe50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1fe60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fe70 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1fe80 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1fe90 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1fea0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1feb0 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20  ss mode last.   
1fec0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
1fed0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
1fee0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
1fef0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
1ff00 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1ff10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
1ff20 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
1ff30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ff40 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
1ff50 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74   kept open and t
1ff60 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1ff70 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
1ff80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ff90 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1ffa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
1ffb0 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
1ffc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ffd0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1ffe0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1fff0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
20000 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
20010 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20020 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
20030 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
20040 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
20050 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
20060 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74   );.    pagerEnt
20070 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
20080 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
20090 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
200a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
200b0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
200c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
200d0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
200e0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
200f0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
20100 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
20110 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
20120 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
20130 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
20140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
20150 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
20160 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
20170 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
20180 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
20190 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
201a0 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
201b0 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
201c0 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
201d0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
201e0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
201f0 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
20200 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
20210 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
20220 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
20230 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
20240 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
20250 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
20260 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
20270 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20280 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
20290 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
202a0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
202b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
202c0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
202d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
202e0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
202f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
20300 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
20310 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
20320 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
20330 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
20340 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
20350 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
20360 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
20370 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
20380 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
20390 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
203a0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
203b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
203c0 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
203d0 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
203e0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
203f0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
20400 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
20410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
20420 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
20430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20440 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
20450 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
20460 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
20470 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
20480 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
20490 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
204a0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
204b0 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a  >pDirty==pPg );.
204c0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
204d0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
204e0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
204f0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
20500 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
20510 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
20520 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
20530 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
20540 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
20550 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
20560 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
20570 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
20580 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
20590 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
205a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
205b0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
205c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
205d0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
205e0 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
205f0 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
20600 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
20610 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
20620 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
20630 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
20640 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
20650 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
20660 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
20670 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
20680 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
20690 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
206a0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
206b0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
206c0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
206d0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
206e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
206f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
20700 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
20710 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
20720 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
20730 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
20740 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
20750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
20760 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
20770 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
20780 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
20790 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
207a0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
207b0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
207c0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
207d0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
207e0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
207f0 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
20800 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20810 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
20820 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20830 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
20840 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
20850 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
20860 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
20870 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
20880 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
20890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208a0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
208b0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
208c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
208d0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
208e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
208f0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
20900 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
20910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20920 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
20930 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20940 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
20950 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
20960 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
20970 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
20980 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
20990 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
209a0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
209b0 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
209c0 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
209d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
209e0 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
209f0 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
20a00 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
20a10 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
20a20 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
20a30 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
20a40 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
20a50 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
20a60 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
20a70 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
20a80 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
20a90 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
20aa0 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
20ab0 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
20ac0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
20ad0 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
20ae0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
20af0 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
20b00 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
20b10 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
20b20 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
20b30 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
20b40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20b50 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
20b60 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
20b70 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
20b80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
20b90 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
20ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
20bb0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
20bc0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
20bd0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
20be0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
20bf0 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
20c00 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
20c10 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
20c20 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
20c30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20c40 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
20c50 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
20c60 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
20c70 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
20c80 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
20c90 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
20ca0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20cb0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
20cc0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
20cd0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
20ce0 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
20cf0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
20d00 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
20d10 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
20d20 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
20d30 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
20d40 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
20d50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
20d60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
20d70 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
20d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20d90 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
20da0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20dd0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
20de0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
20df0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
20e00 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
20e10 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
20e20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
20e30 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
20e40 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
20e50 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
20e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20e70 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
20e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20e90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
20ea0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
20eb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
20ec0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
20ed0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
20ee0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
20ef0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
20f00 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
20f10 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
20f20 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
20f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20f40 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
20f50 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
20f60 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
20f70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
20f80 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
20f90 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
20fa0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
20fb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
20fc0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
20fd0 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   (pPager->useJou
20fe0 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29  rnal || MEMDB) )
20ff0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
21000 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
21010 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21020 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
21030 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66  szPg;.        if
21040 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
21050 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
21060 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
21070 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
21080 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  r);.          PA
21090 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e  GERTRACE3("JOURN
210a0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
210b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
210c0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
210d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
210e0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
210f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
21100 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
21110 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61  ite3_malloc( pPa
21120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
21130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21140 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
21150 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
21160 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
21170 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
21180 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
21190 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
211a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
211b0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
211c0 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20  cksum, saved;.  
211d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
211e0 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20  ata2, *pEnd;..  
211f0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
21200 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
21210 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21220 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
21230 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
21240 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
21250 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
21260 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
21270 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
21280 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
21290 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
212a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
212b0 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
212c0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
212d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
212e0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
212f0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
21300 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
21310 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
21320 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
21330 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
21340 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
21350 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e  Data2 + pPager->
21360 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
21370 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b      pData2 -= 4;
21380 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
21390 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a   = *(u32*)pEnd;.
213a0 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62            put32b
213b0 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29  its(pEnd, cksum)
213c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67  ;.          szPg
213d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
213e0 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20  ize+8;.         
213f0 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
21400 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
21410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21420 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
21430 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
21440 2c 20 73 7a 50 67 2c 20 70 50 61 67 65 72 2d 3e  , szPg, pPager->
21450 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
21460 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
21470 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
21480 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
21490 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
214b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
214c0 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20 20 20 20  , szPg));.      
214d0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
214e0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
214f0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
21500 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
21510 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
21520 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
21530 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c  RTRACE5("JOURNAL
21540 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
21550 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
21560 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
21570 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
21580 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
21590 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
215a0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
215b0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
215c0 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73   *(u32*)pEnd = s
215d0 61 76 65 64 3b 0a 0a 20 20 20 20 20 20 20 20 20  aved;..         
215e0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
215f0 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
21600 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21610 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
21620 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
21630 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
21640 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
21650 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
21660 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21670 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21690 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
216a0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
216b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
216c0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
216d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
216e0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
216f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
21700 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
21710 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
21720 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
21730 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
21740 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
21750 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
21760 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
21770 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
21780 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
21790 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
217a0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
217b0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
217c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
217d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
217e0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
217f0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
21800 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
21810 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
21820 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  c;.        PAGER
21830 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
21840 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
21850 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
21860 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
21870 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21880 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
21890 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
218a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
218b0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
218c0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
218d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
218e0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
218f0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
21900 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
21910 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
21920 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
21930 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
21940 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
21950 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
21960 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
21970 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
21980 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
21990 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
219a0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
219b0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
219c0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
219d0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
219e0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
219f0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
21a00 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
21a10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
21a20 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21a30 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49   .     && !pageI
21a40 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
21a50 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50  .     && (int)pP
21a60 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
21a70 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29  >stmtSize .    )
21a80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21a90 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
21aa0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
21ab0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
21ac0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
21ad0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
21ae0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
21af0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21b00 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
21b10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21b20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
21b30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
21b40 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
21b50 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
21b60 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
21b70 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
21b80 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
21b90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
21ba0 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
21bb0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
21bc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
21bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21be0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
21bf0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
21c00 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
21c10 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
21c20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
21c30 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
21c40 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
21c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c60 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
21c70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a  Pager->stmtNRec*
21c80 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21c90 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ize);.        ch
21ca0 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
21cb0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
21cc0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
21cd0 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  -4;.        put3
21ce0 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
21cf0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
21d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21d10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
21d20 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
21d30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
21d40 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
21d50 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
21d60 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
21d70 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
21d80 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21d90 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
21da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
21dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
21dd0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
21de0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
21df0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21e00 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
21e10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
21e20 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
21e30 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
21e40 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
21e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21e60 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
21e70 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21e80 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
21e90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21ea0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21eb0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
21ec0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
21ed0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
21ee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
21ef0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
21f00 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
21f10 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
21f20 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
21f30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21f40 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
21f50 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
21f60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21f80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
21f90 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
21fa0 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
21fb0 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
21fc0 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
21fd0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
21fe0 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
21ff0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
22000 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
22010 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
22020 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
22030 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
22040 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
22050 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
22060 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
22070 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
22080 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
22090 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
220a0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
220b0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
220c0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
220d0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
220e0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
220f0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
22100 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
22110 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
22120 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
22130 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
22140 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22150 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
22160 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
22170 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
22180 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
22190 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
221a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
221b0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
221c0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
221d0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
221e0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
221f0 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ze);..  pagerEnt
22200 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
22210 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67  ( !MEMDB && nPag
22220 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
22230 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
22240 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
22250 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
22260 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
22270 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
22280 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
22290 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
222a0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
222b0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
222c0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
222d0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
222e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
222f0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
22300 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
22310 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
22320 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65  t ii;.    int ne
22330 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
22340 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
22350 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
22360 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
22370 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
22380 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
22390 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
223a0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
223b0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
223c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
223d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
223e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
223f0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
22400 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
22410 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
22420 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
22430 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
22440 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
22450 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
22460 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
22470 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
22480 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
22490 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
224a0 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
224b0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
224c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
224d0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
224e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
224f0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
22500 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
22510 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
22520 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
22530 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
22540 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
22550 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
22560 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
22570 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
22580 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
22590 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
225a0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
225b0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
225c0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
225d0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
225e0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
225f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
22600 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
22610 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
22620 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
22630 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
22640 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
22650 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
22660 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
22670 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
22680 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
22690 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
226a0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
226b0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
226c0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ge;.      if( !p
226d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
226e0 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67  l || pg==pPg->pg
226f0 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  no || .         
22700 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67   pg>pPager->orig
22710 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67  DbSize || !(pPag
22720 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
22730 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29  g/8]&(1<<(pg&7))
22740 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20  ).      ) {.    
22750 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
22760 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
22770 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
22780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22790 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
227a0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
227b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
227c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
227d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
227e0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
227f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
22800 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ge->needSync ){.
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
22820 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
22830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22840 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22850 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
22860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
22880 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
22890 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
228a0 65 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20 20  er, pg)) ){.    
228b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
228c0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
228d0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
228e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
228f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22900 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e  /* If the PgHdr.
22910 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
22920 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
22930 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
22940 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
22950 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
22960 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
22970 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
22980 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
22990 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
229a0 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
229b0 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
229c0 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
229d0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
229e0 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
229f0 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
22a00 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
22a10 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
22a20 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
22a30 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
22a40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22a50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
22a60 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ( needSync ){.  
22a70 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
22a80 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
22a90 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
22aa0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
22ab0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
22ac0 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
22ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
22ae0 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  e ) pPage->needS
22af0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
22b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
22b10 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
22b20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
22b30 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
22b40 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
22b50 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
22b60 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
22b70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22b80 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
22b90 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
22ba0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
22bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22bc0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
22bd0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
22be0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
22bf0 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
22c00 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
22c10 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
22c20 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
22c30 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
22c40 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
22c50 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
22c60 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
22c70 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
22c80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
22c90 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
22ca0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
22cb0 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
22cc0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
22cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
22ce0 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
22cf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22d00 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
22d10 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
22d20 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
22d30 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
22d40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22d50 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
22d60 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
22d70 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
22d80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
22d90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67    int rc;..  pag
22da0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
22db0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
22dc0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
22dd0 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69  pgno, &pPg);.  i
22de0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22df0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
22e00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22e10 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
22e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22e30 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74      memcpy(sqlit
22e40 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
22e50 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67  Pg), pData, pPag
22e60 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
22e70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22e80 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
22e90 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
22ea0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
22eb0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
22ec0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
22ed0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
22ee0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
22ef0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
22f00 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
22f10 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
22f20 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
22f30 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
22f40 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
22f50 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
22f60 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
22f70 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
22f80 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
22f90 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
22fa0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
22fb0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
22fc0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
22fd0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
22fe0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
22ff0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
23000 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
23010 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
23020 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
23030 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
23040 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
23050 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
23060 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
23070 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
23080 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
23090 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
230a0 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
230b0 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
230c0 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
230d0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
230e0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
230f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
23100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
23110 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
23120 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
23130 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
23140 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
23150 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
23160 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
23170 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
23180 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
23190 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
231a0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
231b0 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
231c0 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
231d0 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
231e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
231f0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
23200 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
23210 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
23220 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
23230 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
23240 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
23250 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
23260 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
23270 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
23280 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
23290 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
232a0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
232b0 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
232c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
232d0 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
232e0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
232f0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72  DontRollback() r
23300 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
23310 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
23320 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  he.** page conta
23330 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74  ins critical dat
23340 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
23350 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
23360 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ets.** rolled ba
23370 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74  ck in spite of t
23380 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
23390 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61  ontRollback() ca
233a0 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
233b0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
233c0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
233d0 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
233e0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
233f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
23400 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
23410 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
23420 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
23430 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61  Pager);.  pPg->a
23440 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
23450 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
23460 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
23470 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
23480 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23490 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
234a0 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
234b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
234c0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
234d0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
234e0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
234f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
23500 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
23510 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
23520 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
23530 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
23540 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
23550 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23560 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
23570 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
23580 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
23590 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
235a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
235b0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
235c0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
235d0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
235e0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
235f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
23600 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
23610 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
23620 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
23630 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
23640 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
23650 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
23660 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
23670 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
23680 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
23690 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
236a0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
236b0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
236c0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
236d0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
236e0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
236f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23700 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
23710 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
23720 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
23730 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
23740 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
23750 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
23760 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
23770 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
23780 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
23790 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
237a0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
237b0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
237c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
237d0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
237e0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
237f0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d  Leave(pPager);.}
23800 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
23810 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
23820 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
23830 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
23840 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
23850 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
23860 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
23870 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
23880 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
23890 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
238a0 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
238b0 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
238c0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
238d0 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
238e0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
238f0 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  f we have not ye
23900 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  t actually read 
23910 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
23920 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20  his page (if.** 
23930 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
23940 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20  ad flag is set) 
23950 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
23960 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d  e acts as a prom
23970 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77  ise.** that we w
23980 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74  ill never need t
23990 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  o read the page 
239a0 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66  content in the f
239b0 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65  uture..** so the
239c0 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63   needRead flag c
239d0 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  an be cleared at
239e0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
239f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23a00 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62  rDontRollback(Db
23a10 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
23a20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
23a30 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61  g->pPager;..  pa
23a40 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
23a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23a60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
23a70 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
23a80 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
23a90 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
23aa0 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
23ab0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
23ac0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
23ad0 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
23ae0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
23af0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
23b00 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
23b10 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
23b20 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
23b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23b40 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
23b50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
23b60 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
23b70 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
23b80 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
23b90 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
23ba0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52  ;.    pPg->needR
23bb0 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ead = 0;.    if(
23bc0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
23bd0 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
23be0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
23bf0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
23c00 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
23c10 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41    }.    PAGERTRA
23c20 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
23c30 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
23c40 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
23c50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
23c60 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
23c70 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
23c80 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
23c90 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20  gno)).  }.  if( 
23ca0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23cb0 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e  e .   && !pageIn
23cc0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
23cd0 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
23ce0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
23cf0 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  mtSize .  ){.   
23d00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
23d10 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
23d20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
23d30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
23d40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23d50 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
23d60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
23d70 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
23d80 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
23d90 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61  gno&7);.  }.  pa
23da0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
23db0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
23dc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
23dd0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
23de0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23df0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
23e00 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
23e10 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
23e20 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
23e30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
23e40 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
23e50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23e60 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20  int isDirect){. 
23e70 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
23e80 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
23e90 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nter;.  int rc =
23ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
23eb0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
23ec0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
23ed0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
23ee0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
23ef0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
23f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23f10 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
23f20 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
23f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23f40 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
23f50 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
23f60 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
23f70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23f80 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
23f90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23fa0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
23fb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
23fc0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
23fd0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
23fe0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
23ff0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
24000 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
24010 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
24020 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
24030 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
24040 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
24050 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
24060 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  ((char*)PGHDR_TO
24070 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32  _DATA(pPgHdr))+2
24080 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
24090 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44  r);..    if( isD
240a0 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d  irect && pPager-
240b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
240c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  .      const voi
240d0 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f  d *zBuf = PGHDR_
240e0 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b  TO_DATA(pPgHdr);
240f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24100 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
24110 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
24120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
24130 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
24140 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
24150 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
24160 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24170 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
24180 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
24190 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
241a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
241b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
241c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
241d0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
241e0 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
241f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
24200 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
24210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
24220 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
24230 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
24240 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
24250 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
24260 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
24270 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
24280 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
24290 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
242a0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
242b0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
242c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
242d0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
242e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
242f0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
24300 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
24310 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
24320 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
24330 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
24340 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
24350 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
24360 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
24370 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
24380 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
24390 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
243a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
243b0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
243c0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
243d0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
243e0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
243f0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
24400 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
24410 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
24420 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
24430 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
24440 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
24450 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
24460 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
24470 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
24480 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
24490 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
244a0 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
244b0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
244c0 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
244d0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
244e0 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50  aseOne(Pager *pP
244f0 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
24500 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
24510 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
24520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24530 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
24540 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
24550 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
24560 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
24570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
24580 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
24590 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67  , nTrunc);.  pag
245a0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
245b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
245c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
245d0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
245e0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
245f0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
24600 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
24610 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
24620 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
24630 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
24640 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
24650 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
24660 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
24670 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
24680 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69   PgHdr *pPg;..#i
24690 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
246a0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
246b0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
246c0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
246d0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
246e0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
246f0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
24700 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
24710 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
24720 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
24730 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
24740 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
24750 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
24760 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
24770 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
24780 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
24790 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
247a0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
247b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
247c0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
247d0 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
247e0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
247f0 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
24800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
24810 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
24820 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
24830 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
24840 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
24850 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
24860 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
24870 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
24880 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
24890 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69      int useAtomi
248a0 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20  cWrite = (.     
248b0 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a     !zMaster && .
248c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
248d0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
248e0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
248f0 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e  r) && .        n
24900 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20  Trunc==0 && .   
24910 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d       (0==pPager-
24920 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50  >pDirty || 0==pP
24930 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44  ager->pDirty->pD
24940 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20  irty).    );.   
24950 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72   if( useAtomicWr
24960 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ite ){.      /* 
24970 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  Update the nRec 
24980 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75  field in the jou
24990 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
249a0 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d      int offset =
249b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
249c0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
249d0 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
249e0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
249f0 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20  ->nRec==1);.    
24a00 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
24a10 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
24a20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e  offset, pPager->
24a30 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nRec);..      /*
24a40 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
24a50 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
24a60 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
24a70 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69  g call will modi
24a80 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  fy.      ** the 
24a90 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
24aa0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
24ab0 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68   1 to include th
24ac0 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20  e updated.      
24ad0 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
24ae0 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
24af0 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79   page 1 directly
24b00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24b10 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  .      ** file. 
24b20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
24b30 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
24b40 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
24b50 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20   file-system, . 
24b60 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
24b70 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  safe..      */. 
24b80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
24b90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
24ba0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
24bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
24bd0 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
24be0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
24bf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24c00 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
24c10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24c20 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
24c30 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   ).#endif..    /
24c40 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
24c50 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
24c70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
24c80 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
24c90 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
24ca0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
24cb0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
24cc0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
24cd0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
24ce0 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
24cf0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
24d00 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
24d10 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
24d20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
24d30 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
24d40 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
24d50 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
24d60 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
24d70 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
24d80 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
24d90 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
24da0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
24db0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61  aster ){.      a
24dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
24dd0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
24de0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
24df0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
24e00 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
24e10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24e20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
24e30 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
24e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24e50 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
24e60 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
24e70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
24e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
24e90 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
24ea0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
24eb0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
24ec0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
24ed0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
24ee0 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
24ef0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
24f00 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
24f10 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
24f20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
24f30 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  i;.        int i
24f40 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
24f50 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
24f60 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
24f70 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
24f80 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
24f90 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
24fa0 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
24fb0 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
24fc0 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
24fd0 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
24fe0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24ff0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
25000 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
25010 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
25020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
25030 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
25040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25050 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25060 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
25070 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
25080 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
25090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
250a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
250b0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
250c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
250d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
250e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
250f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
25100 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
25110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25120 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
25130 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
25140 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
25150 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
25160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25170 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
25180 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
25190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
251a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
251b0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
251c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
251d0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
251e0 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
251f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25200 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
25210 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
25220 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
25230 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
25240 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
25250 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
25260 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
25270 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
25280 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
25290 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
252a0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
252b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
252c0 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  K ){.      while
252d0 28 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e 64  ( pPg && !pPg->d
252e0 69 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70 50  irty ){ pPg = pP
252f0 67 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20 20  g->pDirty; }.   
25300 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
25310 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 67  y = pPg;.      g
25320 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
25330 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
25340 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20  >pDirty = 0;..  
25350 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
25360 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
25370 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
25380 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
25390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
253a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
253b0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
253c0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
253d0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
253e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
253f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
25400 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
25410 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
25420 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
25430 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
25440 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
25450 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
25460 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
25470 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
25480 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
25490 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
254a0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
254b0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
254c0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
254d0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
254e0 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
254f0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
25500 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
25510 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
25520 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
25530 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
25540 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
25550 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a 20  nt, it's.     * 
25560 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
25570 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
25580 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
25590 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
255a0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
255b0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
255c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
255d0 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
255e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
255f0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
25600 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
25610 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
25620 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
25630 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
25640 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
25650 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
25660 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25670 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
25680 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
25690 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
256a0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
256b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
256c0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
256d0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
256e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
256f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
25700 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
25710 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
25720 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
25730 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
25740 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
25750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25760 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67  ERROR;.  }.  pag
25770 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
25780 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
25790 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
257a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
257b0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
257c0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
257d0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
257e0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
257f0 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
25800 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
25810 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
25820 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
25830 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  );.      clearHi
25840 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
25850 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
25860 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
25870 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
25880 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
25890 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
258a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
258b0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
258c0 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
258d0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
258e0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
258f0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
25900 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
25910 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44   = 0;.#ifndef ND
25920 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
25930 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
25940 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
25950 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
25960 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
25970 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
25980 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
25990 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
259a0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
259b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
259c0 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
259d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
259e0 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
259f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25a00 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
25a10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25a20 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
25a30 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
25a40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25a60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
25a70 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  | !pPager->dirty
25a80 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72  Cache );.  asser
25a90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25aa0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
25ab0 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  | !pPager->dirty
25ac0 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20  Cache );.  rc = 
25ad0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
25ae0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
25af0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
25b00 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
25b10 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25b20 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
25b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
25b40 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
25b50 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
25b60 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
25b70 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
25b80 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
25b90 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
25ba0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
25bb0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
25bc0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
25bd0 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
25be0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25bf0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
25c00 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
25c10 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
25c20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
25c30 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
25c40 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c   protocol or unl
25c50 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
25c60 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
25c70 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
25c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c90 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
25ca0 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
25cb0 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
25cc0 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
25cd0 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
25ce0 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
25cf0 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
25d00 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
25d10 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
25d20 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
25d30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
25d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25d50 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
25d60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25d70 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43   rc;.  PAGERTRAC
25d80 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
25d90 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
25da0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
25db0 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
25dc0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
25dd0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
25de0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
25df0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
25e00 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
25e10 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
25e20 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
25e30 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
25e40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25e50 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
25e60 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
25e70 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
25e80 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
25e90 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
25ea0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
25eb0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
25ec0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
25ed0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
25ee0 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
25ef0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
25f00 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
25f10 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
25f20 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
25f30 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
25f40 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
25f50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
25f60 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ize);.        PA
25f70 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42  GERTRACE3("ROLLB
25f80 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
25f90 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
25fa0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
25fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25fc0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
25fd0 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
25fe0 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
25ff0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
26000 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
26010 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
26020 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
26030 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
26040 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
26050 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  al = 0;.      pH
26060 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
26070 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
26080 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
26090 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
260a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
260b0 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
260c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
260d0 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67  Reiniter(p, pPag
260e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
260f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26100 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
26110 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26120 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
26130 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
26140 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
26150 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  ize;.    pager_t
26160 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
26170 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
26180 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
26190 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
261a0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
261b0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
261c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
261d0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
261e0 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  er);.  if( !pPag
261f0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
26200 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
26210 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
26220 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
26230 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
26240 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
26250 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
26260 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
26270 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
26280 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
26290 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
262a0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
262b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
262c0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
262d0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
262e0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
262f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
26300 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26310 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
26320 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
26330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26340 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
26350 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
26360 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
26370 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
26380 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20  er, 0);.    rc2 
26390 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
263a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
263b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
263c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
263d0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
263e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
263f0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
26400 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
26410 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65  .  /* pager_rese
26420 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  t(pPager); */.  
26430 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
26440 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
26450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
26460 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
26470 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
26480 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
26490 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
264a0 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
264b0 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
264c0 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
264d0 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
264e0 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63  stent..  */.  rc
264f0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
26500 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61  Pager, rc);.  pa
26510 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26520 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26530 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
26540 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
26550 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
26560 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
26570 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
26580 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
26590 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
265a0 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
265b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
265c0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
265d0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
265e0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
265f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26600 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
26610 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
26620 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
26630 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
26640 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
26650 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
26660 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69  ger->nRef;.}..#i
26670 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
26680 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26690 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
266a0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
266b0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
266c0 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
266d0 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
266e0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
266f0 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
26700 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
26710 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
26720 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
26730 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
26740 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
26750 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
26760 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
26770 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
26780 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
26790 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
267a0 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
267b0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
267c0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
267d0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
267e0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
267f0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
26800 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
26810 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
26820 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
26830 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
26840 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
26850 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
26860 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
26870 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
26880 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
26890 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
268a0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
268b0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
268c0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
268d0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
268e0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
268f0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
26900 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
26910 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
26920 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
26930 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d  tic int pagerStm
26940 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
26950 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
26960 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
26970 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
26980 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26990 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
269a0 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
269b0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
269c0 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
269d0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
269e0 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
269f0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
26a00 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26a10 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
26a20 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
26a30 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
26a40 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
26a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26a60 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
26a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
26a80 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
26a90 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
26aa0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
26ab0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
26ac0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
26ad0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
26ae0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
26af0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
26b00 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  nStmt = sqlite3M
26b10 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
26b20 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
26b30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
26b40 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
26b50 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
26b60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
26b70 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
26b80 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
26b90 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
26ba0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26bb0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
26bc0 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
26bd0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
26be0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
26bf0 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
26c00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
26c10 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
26c20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26c30 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
26c40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26c50 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
26c60 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
26c70 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26c80 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
26c90 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
26ca0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
26cb0 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
26cc0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
26cd0 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
26ce0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
26cf0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
26d00 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
26d10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
26d20 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
26d30 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74  pVfs, pPager->st
26d40 66 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  fd, 0);.    if( 
26d50 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
26d60 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
26d70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
26d80 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
26d90 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
26da0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
26db0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
26dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26dd0 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66  ;. .stmt_begin_f
26de0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
26df0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a  ger->aInStmt ){.
26e00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26e10 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
26e20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
26e30 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
26e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
26e50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
26e60 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
26e70 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
26e80 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
26e90 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
26ea0 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  pagerStmtBegin(p
26eb0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c  Pager);.  pagerL
26ec0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
26ed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26ee0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
26ef0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
26f00 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
26f10 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
26f20 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74  ger){.  pagerEnt
26f30 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
26f40 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
26f50 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
26f60 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
26f70 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
26f80 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
26f90 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26fa0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
26fb0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
26fc0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
26fd0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
26fe0 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
26ff0 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67 65  ite3_free( pPage
27000 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
27010 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
27020 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
27030 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
27040 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
27050 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
27060 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
27070 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
27080 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
27090 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
270a0 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
270b0 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
270c0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
270d0 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
270e0 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
270f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
27100 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
27110 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
27120 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
27130 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
27140 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
27150 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
27160 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
27170 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
27180 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
27190 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
271a0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
271b0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
271c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
271d0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
271e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
271f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
27200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27210 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
27220 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
27230 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
27240 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
27250 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
27260 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
27270 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
27280 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
27290 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
272a0 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
272b0 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
272c0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
272d0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
272e0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
272f0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
27300 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72  pHist;.      for
27310 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
27320 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69  mt; pPg; pPg=pHi
27330 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  st->pNextStmt){.
27340 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20          pHist = 
27350 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
27360 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
27370 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
27380 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
27390 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
273a0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
273b0 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
273c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
273d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
273e0 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
273f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
27400 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
27410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27420 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
27430 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
27440 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
27450 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
27460 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
27470 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27480 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
27490 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
274a0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
274b0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
274c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
274d0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
274e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
274f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27500 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
27510 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
27520 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
27530 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
27540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27550 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
27560 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
27570 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
27580 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
27590 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
275a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
275b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
275c0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
275d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
275e0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
275f0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
27600 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
27610 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
27620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27630 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
27640 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
27650 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
27660 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
27670 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
27680 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
27690 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
276a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
276b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
276c0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
276d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
276e0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
276f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27700 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
27710 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
27720 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
27730 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
27740 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
27750 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
27760 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
27770 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
27780 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
27790 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
277a0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
277b0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
277c0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
277d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
277e0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
277f0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
27800 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
27810 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27820 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
27830 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
27840 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
27850 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27860 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
27870 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
27880 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
27890 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
278a0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
278b0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
278c0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
278d0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
278e0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
278f0 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
27900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
27920 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
27930 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
27940 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
27950 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
27960 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
27970 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
27980 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
27990 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
279a0 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
279b0 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
279c0 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
279d0 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
279e0 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
279f0 70 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f  page previous lo
27a00 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
27a10 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
27a20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
27a30 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
27a40 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
27a50 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
27a60 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
27a70 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
27a80 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
27a90 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
27aa0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
27ab0 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
27ac0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
27ad0 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
27ae0 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
27af0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
27b00 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
27b10 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
27b20 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
27b30 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
27b40 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
27b50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
27b60 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
27b70 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
27b80 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
27b90 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
27ba0 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
27bb0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
27bc0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
27bd0 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
27be0 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
27bf0 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
27c00 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
27c10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
27c20 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
27c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
27c40 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
27c50 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
27c60 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
27c70 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
27c80 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e  /* The page bein
27c90 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a  g overwritten. *
27ca0 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e  /.  int h;.  Pgn
27cb0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
27cc0 20 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65   0;..  pagerEnte
27cd0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
27ce0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
27cf0 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
27d00 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
27d10 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
27d20 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
27d30 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
27d40 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
27d50 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
27d60 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
27d70 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
27d80 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
27d90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
27da0 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
27db0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
27dc0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
27dd0 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
27de0 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
27df0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
27e00 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
27e10 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
27e20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
27e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
27e40 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
27e50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27e60 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
27e70 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
27e80 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
27e90 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
27ea0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
27eb0 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
27ec0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
27ed0 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
27ee0 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
27ef0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
27f00 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
27f10 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
27f20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
27f30 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
27f40 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
27f50 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
27f60 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
27f70 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
27f80 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
27f90 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
27fa0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
27fb0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
27fc0 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
27fd0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
27fe0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
27ff0 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
28000 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
28010 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
28020 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
28030 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b  pPgOld);.    mak
28040 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a  eClean(pPgOld);.
28050 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
28060 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  c = pPgOld->need
28070 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sync;.  }else{. 
28080 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
28090 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
280a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
280b0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
280c0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
280d0 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ize ){.    pPg->
280e0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50  inJournal =  (pP
280f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
28100 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
28110 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
28120 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
28130 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
28140 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
28150 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28  needSync==0 || (
28160 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
28170 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
28180 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
28190 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
281a0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
281b0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
281c0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
281d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
281e0 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
281f0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
28200 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
28210 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
28220 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
28230 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
28240 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
28250 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
28260 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
28270 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
28280 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
28290 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
282a0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
282b0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
282c0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
282d0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
282e0 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
282f0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
28300 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
28310 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
28320 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
28330 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
28340 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
28350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28360 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
28370 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
28380 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
28390 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
283a0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
283b0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
283c0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
283d0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
283e0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
283f0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
28400 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f    ** Pager.aInJo
28410 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
28420 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
28430 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
28440 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
28450 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
28460 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
28470 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
28480 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
28490 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
284a0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
284b0 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
284c0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
284d0 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
284e0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
284f0 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
28500 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
28510 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
28520 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
28530 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
28540 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28550 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
28560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28570 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
28580 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
28590 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
285a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
285b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
285c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
285d0 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
285e0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
285f0 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
28600 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
28610 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
28620 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28630 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
28640 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  }..  pagerLeave(
28650 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
28660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
28670 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
28680 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28690 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
286a0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
286b0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
286c0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
286d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
286e0 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
286f0 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
28700 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
28710 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
28720 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
28730 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
28740 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
28750 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
28760 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
28770 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
28780 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
28790 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
287a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
287b0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
287c0 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
287d0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
287e0 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
287f0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
28800 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
28810 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
28820 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
28830 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
28840 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
28850 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
28860 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
28870 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
28880 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
28890 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
288a0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
288b0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
288c0 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
288d0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
288e0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
288f0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
28900 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
28910 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
28920 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
28930 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
28940 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
28950 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
28960 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
28970 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
28980 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
28990 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
289a0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
289b0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
289c0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
289d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
289e0 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
289f0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
28a00 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
28a10 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
28a20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
28a30 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
28a40 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
28a50 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
28a60 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
28a70 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
28a80 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
28a90 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
28aa0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
28ab0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
28ac0 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
28ad0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28ae0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28af0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
28b00 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
28b10 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
28b20 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
28b30 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
28b40 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
28b50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
28b60 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
28b70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
28b80 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
28b90 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
28ba0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
28bb0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
28bc0 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
28bd0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
28be0 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
28bf0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
28c00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
28c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
28c20 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
28c30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28c40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
28c50 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
28c60 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
28c70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28c80 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
28c90 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
28ca0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
28cb0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
28cc0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
28cd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
28ce0 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
28cf0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
28d00 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
28d10 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
28d20 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
28d30 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
28d40 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
28d50 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
28d60 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
28d70 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
28d80 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
28d90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
28da0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
28db0 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
28dc0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
28dd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
28de0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.