/ Hex Artifact Content
Login

Artifact 847674a74c232f3f7c386d4b902df41a60f781c4:


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: 31 20 32 30 30 37 2f 30 38 2f 33 30 20 30 38 3a  1 2007/08/30 08:
0360: 30 38 3a 31 37 20 64 61 6e 69 65 6c 6b 31 39 37  08:17 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 73 75  n into memory su
87e0: 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61  pplied by the ca
87f0: 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61  ller. .**.** zMa
8800: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
8810: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
8820: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
8830: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
8840: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
8850: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
8860: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
8870: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
8880: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
8890: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
88a0: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
88b0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
88c0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
88d0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
88e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
88f0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
8900: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
8910: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
8920: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
8930: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
8940: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
8950: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
8960: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
8970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
8980: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
8990: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
89a0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d  me is present zM
89b0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
89c0: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
89d0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
89e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
89f0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
8a00: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
8a10: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
8a20: 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29  er, int nMaster)
8a30: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  {.  int rc;.  u3
8a40: 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a  2 len;.  i64 szJ
8a50: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
8a60: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
8a70: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
8a80: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
8a90: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
8aa0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d   header */..  zM
8ab0: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
8ac0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8ad0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
8ae0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
8af0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8b00: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
8b10: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
8b20: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8b30: 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  J-16, &len);.  i
8b40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8b50: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8b60: 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65   if( len>=nMaste
8b70: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
8b80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
8b90: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8ba0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
8bb0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
8bc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8bd0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8be0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8bf0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
8c00: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
8c10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8c20: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
8c30: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
8c40: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
8c50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8c60: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
8c70: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
8c80: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
8c90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8ca0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8cb0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
8cc0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53   = '\0';..  /* S
8cd0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
8ce0: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
8cf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8d00: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  me */.  for(i=0;
8d10: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
8d20: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
8d30: 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66  er[i];.   }.  if
8d40: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
8d50: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
8d60: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
8d70: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
8d80: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
8d90: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
8da0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
8db0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8dc0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
8dd0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
8de0: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
8df0: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
8e00: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
8e10: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
8e20: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
8e30: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
8e40: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
8e50: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
8e60: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
8e70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8e80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
8e90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8ea0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
8eb0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
8ec0: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
8ed0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
8ee0: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
8ef0: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
8f00: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
8f10: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
8f20: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
8f30: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
8f40: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
8f50: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
8f60: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
8f70: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
8f80: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
8fb0: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
8fd0: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
8ff0: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
9000: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
9010: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
9030: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
9040: 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  void seekJournal
9050: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
9060: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
9070: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
9080: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9090: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
90a0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
90b0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
90c0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
90d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90e0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
90f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
9100: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9110: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
9120: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
9130: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
9140: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
9150: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
9160: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9170: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
9180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
9190: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
91a0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
91b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
91c0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
91d0: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
91e0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
91f0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9210: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
9220: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
9230: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
9240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9250: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
9260: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
9270: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
9280: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
9290: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
92a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
92b0: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
92c0: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
92d0: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
92e0: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
92f0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
9300: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
9310: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
9320: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
9330: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
9340: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
9350: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
9360: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
9370: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a  s journal..** .*
9380: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
9390: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
93a0: 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  24) bytes of unu
93b0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
93c0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
93d0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
93e0: 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20  pPager){.  char 
93f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9400: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
9410: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
9420: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
9430: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
9440: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
9450: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9460: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20  urnalOff;.  }.. 
9470: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
9480: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
9490: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
94a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
94b0: 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48  ff;..  memcpy(zH
94c0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
94d0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
94e0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
94f0: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
9500: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
9510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9520: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
9530: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
9540: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
9550: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
9560: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
9570: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
9580: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
9590: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
95a0: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
95b0: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
95c0: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
95d0: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
95e0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
95f0: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
9600: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
9610: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
9620: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
9630: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
9640: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
9650: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
9660: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
9670: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
9680: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
9690: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
96a0: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
96b0: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
96c0: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
96d0: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
96e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
96f0: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
9700: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
9710: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
9720: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
9730: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
9740: 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
9750: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
9760: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
9770: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
9780: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
9790: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
97a0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
97b0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
97c0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
97d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
97e0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
97f0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
9800: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
9810: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
9820: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
9830: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
9840: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
9850: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
9860: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
9870: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
9880: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
9890: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
98a0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
98b0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
98c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
98d0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
98e0: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
98f0: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e  thods||pPager->n
9900: 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70  oSync);.  if( (p
9910: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a  Pager->noSync) .
9920: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
9930: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
9940: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
9950: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
9960: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
9970: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
9980: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9990: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
99a0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
99b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
99c0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
99d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
99e0: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
99f0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
9a00: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
9a10: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
9a20: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
9a30: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
9a40: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
9a50: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
9a60: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9a70: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9a80: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
9a90: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
9aa0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
9ab0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
9ac0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
9ad0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9ae0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
9af0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
9b00: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
9b10: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
9b20: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
9b30: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
9b40: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9b50: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
9b60: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
9b70: 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41  orSize);.  IOTRA
9b80: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
9b90: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
9ba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9bb0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  Hdr, sizeof(zHea
9bc0: 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71  der))).  rc = sq
9bd0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9be0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
9bf0: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
9c00: 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r),pPager->journ
9c10: 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72  alOff);.  pPager
9c20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9c30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9c40: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  Pager);..  /* Th
9c50: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9c60: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
9c70: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
9c80: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
9c90: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
9ca0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
9cb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9cc0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
9cd0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
9ce0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49  LITE_OK ){.    I
9cf0: 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25  OTRACE(("JTAIL %
9d00: 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
9d10: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
9d20: 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63  alOff-1)).    rc
9d30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9d40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
9d50: 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67 65 72  \000", 1, pPager
9d60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b  ->journalOff-1);
9d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9d90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9da0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9db0: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
9dc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9dd0: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
9de0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
9df0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
9e00: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
9e10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
9e20: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
9e30: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
9e40: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
9e50: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
9e60: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
9e70: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9e80: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
9e90: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
9ea0: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
9eb0: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
9ec0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9ed0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
9ee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
9ef0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
9f00: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
9f10: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
9f20: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
9f30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9f40: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
9f50: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
9f60: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
9f70: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
9f80: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9f90: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
9fa0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
9fb0: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
9fc0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
9fd0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9fe0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
9ff0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
a000: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
a010: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
a020: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
a030: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
a040: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
a050: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
a060: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
a070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
a080: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a090: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
a0a0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
a0b0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
a0c0: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
a0d0: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
a0e0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
a0f0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
a100: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
a110: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
a120: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
a130: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
a140: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
a150: 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b  jrnlOff;..  seek
a160: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
a170: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
a180: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
a190: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
a1a0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
a1b0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
a1c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
a1d0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
a1e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
a1f0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
a200: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
a210: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
a220: 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  of(aMagic), jrnl
a230: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Off);.  if( rc )
a240: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
a250: 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28  nlOff += sizeof(
a260: 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20  aMagic);..  if( 
a270: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
a280: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
a290: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
a2a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a2b0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
a2c0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
a2d0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a2e0: 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b  jrnlOff, pNRec);
a2f0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a300: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
a310: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a320: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34  ->jfd, jrnlOff+4
a330: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
a340: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
a350: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a360: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a370: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a380: 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29  lOff+8, pDbSize)
a390: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a3a0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
a3b0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
a3c0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
a3d0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
a3e0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
a3f0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
a400: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
a410: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
a420: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
a430: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a440: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
a450: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
a460: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
a470: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
a480: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
a490: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
a4a0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
a4b0: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
a4c0: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
a4d0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
a4e0: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
a4f0: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
a500: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a510: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75  , jrnlOff+12, (u
a520: 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65  32 *)&pPager->se
a530: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
a540: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a550: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
a560: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
a570: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a580: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a590: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
a5a0: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
a5b0: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
a5c0: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
a5d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a5e0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
a5f0: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
a600: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
a610: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a620: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
a630: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
a640: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
a650: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
a660: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
a670: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
a680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
a690: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
a6a0: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
a6b0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
a6c0: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
a6d0: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
a6e0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
a6f0: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
a700: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
a710: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
a720: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
a730: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
a740: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
a750: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
a760: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
a770: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
a780: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
a790: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
a7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a7b0: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
a7c0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
a7d0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a7e0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
a7f0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
a800: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
a810: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
a820: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
a830: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
a840: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
a850: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
a860: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
a870: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
a880: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
a890: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
a8a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
a8b0: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
a8c0: 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66  i; .  i64 jrnlOf
a8d0: 66 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  f;.  u32 cksum =
a8e0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
a8f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a900: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
a910: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
a920: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a940: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
a950: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
a960: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
a970: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
a980: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
a990: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
a9a0: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
a9b0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
a9c0: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
a9d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
a9e0: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
a9f0: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
aa00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
aa10: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
aa20: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
aa30: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
aa40: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
aa50: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
aa60: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
aa70: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
aa80: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73  ullSync ){.    s
aa90: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
aaa0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e  ager);.  }.  jrn
aab0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
aac0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
aad0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
aae0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
aaf0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
ab00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
ab10: 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  nlOff, PAGER_MJ_
ab20: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
ab30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ab40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
ab50: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a    jrnlOff += 4;.
ab60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
ab70: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
ab80: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
ab90: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
aba0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
abb0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
abc0: 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a  rnlOff += len;..
abd0: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
abe0: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
abf0: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
ac00: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
ac10: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
ac20: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
ac30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
ac40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ac50: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
ac60: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
ac70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ac80: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50  , jrnlOff);.  pP
ac90: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
aca0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
acb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
acc0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
acd0: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
ace0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
acf0: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
ad00: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
ad10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
ad20: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
ad30: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
ad40: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
ad50: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
ad60: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
ad70: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
ad80: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
ad90: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
ada0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
adb0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
adc0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
add0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
ade0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
adf0: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
ae00: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
ae10: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
ae20: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
ae30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
ae40: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
ae50: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ae60: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ae70: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
ae80: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
ae90: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
aea0: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
aeb0: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
aec0: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
aed0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
aee0: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
aef0: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
af00: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
af10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
af20: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
af30: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
af40: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
af50: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
af60: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
af70: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
af80: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
af90: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
afa0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
afb0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
afc0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
afd0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
afe0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
aff0: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
b000: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
b010: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b020: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
b030: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
b040: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
b050: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
b060: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
b070: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
b080: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
b090: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
b0a0: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
b0b0: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
b0c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
b0d0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
b0e0: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
b0f0: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
b100: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
b110: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
b120: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
b130: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
b140: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
b150: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
b160: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
b170: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b180: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
b190: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6f  MEMDB ){.      o
b1a0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b1b0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
b1c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b1d0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
b1e0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
b1f0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
b200: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
b210: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
b220: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
b230: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
b240: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
b250: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b260: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b270: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b280: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b290: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b2a0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
b2b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
b2c0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
b2d0: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
b2e0: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
b2f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
b300: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
b310: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
b320: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
b330: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
b340: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
b350: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
b360: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
b370: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
b380: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
b390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
b3a0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
b3b0: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
b3c0: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
b3d0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
b3e0: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
b3f0: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
b400: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
b410: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
b420: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
b430: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
b440: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
b450: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  e );.}.../*.** C
b460: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
b470: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
b480: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
b490: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
b4a0: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
b4b0: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
b4c0: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
b4d0: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
b4e0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
b4f0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
b500: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
b510: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
b520: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
b530: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
b540: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
b550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b560: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
b570: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
b580: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
b590: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
b5a0: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
b5b0: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
b5c0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
b5d0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
b5e0: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
b5f0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
b600: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
b610: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
b620: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
b630: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
b640: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
b650: 78 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69  xtAll;.    lruLi
b660: 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20  stRemove(pPg);. 
b670: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b680: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pPg);.  }.  asse
b690: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
b6a0: 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73  First==0);.  ass
b6b0: 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
b6c0: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29  pFirstSynced==0)
b6d0: 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
b6e0: 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29  r->lru.pLast==0)
b6f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
b700: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
b710: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
b720: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
b730: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b740: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
b750: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
b760: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
b770: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
b780: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
b790: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b7a0: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
b7b0: 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61  ction.  A transa
b7c0: 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62  ction is ended b
b7d0: 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f  y either.** a CO
b7e0: 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
b7f0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  CK..**.** When t
b800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b810: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
b820: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
b830: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
b840: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
b850: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
b860: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
b870: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
b880: 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ll release.** th
b890: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
b8a0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
b8b0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
b8c0: 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20  s place if that 
b8d0: 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  is.** the approp
b8e0: 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64  riate thing to d
b8f0: 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b  o.  Release lock
b900: 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70  s usually is app
b910: 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c  ropriate,.** unl
b920: 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78  ess we are in ex
b930: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
b940: 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68  ode or unless th
b950: 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d  is is a .** COMM
b960: 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20  IT AND BEGIN or 
b970: 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47  ROLLBACK AND BEG
b980: 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  IN operation..**
b990: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
b9a0: 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64  file is either d
b9b0: 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61  eleted or trunca
b9c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ted..**.** TODO:
b9d0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
b9e0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
b9f0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
ba00: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
ba10: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
ba20: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
ba30: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
ba40: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
ba50: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
ba60: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
ba70: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
ba80: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ba90: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
baa0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bab0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
bac0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bad0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
bae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
baf0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
bb00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
bb10: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
bb20: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
bb30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
bb40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
bb50: 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
bb60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
bb70: 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67  tmtOpen && !pPag
bb80: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bb90: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
bba0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
bbb0: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
bbc0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
bbd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
bbe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
bbf0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
bc00: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bc10: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72  .          && (r
bc20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
bc30: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
bc40: 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  d, 0))==SQLITE_O
bc50: 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70 50 61 67  K ){;.      pPag
bc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
bc70: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
bc80: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
bc90: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
bca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
bcb0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
bcc0: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
bcd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
bce0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
bcf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bd00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bd10: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
bd20: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
bd30: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
bd40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
bd50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20 70   sqlite3_free( p
bd60: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
bd70: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
bd80: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
bd90: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
bda0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
bdb0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
bdc0: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
bdd0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
bde0: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
bdf0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
be00: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
be10: 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f     pPg->alwaysRo
be20: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64  llback = 0;.#ifd
be30: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
be40: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
be50: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
be60: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
be70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
be80: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
be90: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
bea0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
beb0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
bec0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
bed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bee0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
bef0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
bf00: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
bf10: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
bf20: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
bf30: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
bf40: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bf50: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
bf60: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
bf70: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
bf80: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
bf90: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
bfa0: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
bfb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
bfc0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
bfd0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
bfe0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
bff0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
c000: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c010: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
c020: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
c030: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
c040: 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74  c = 0;.  lruList
c050: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
c060: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
c070: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
c080: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
c090: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
c0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
c0b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
c0c0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
c0d0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
c0e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
c0f0: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
c100: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
c110: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
c120: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
c130: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
c140: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
c150: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
c160: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
c170: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
c180: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
c190: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
c1a0: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
c1b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
c1c0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
c1d0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
c1e0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
c1f0: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
c200: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
c210: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
c220: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
c230: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
c240: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
c250: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
c260: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
c270: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
c280: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
c290: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
c2a0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
c2b0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
c2c0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
c2d0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
c2e0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
c2f0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
c300: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
c310: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
c320: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
c330: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
c340: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
c350: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
c360: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
c370: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
c380: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
c390: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
c3a0: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
c3b0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
c3c0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
c3d0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
c3e0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
c3f0: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
c400: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
c410: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
c420: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
c430: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
c440: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
c450: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
c460: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
c470: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
c480: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
c490: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
c4a0: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
c4b0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
c4c0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
c4d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
c4e0: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
c4f0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
c500: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
c510: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
c520: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
c530: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
c540: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
c550: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
c560: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
c570: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
c580: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
c590: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
c5a0: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
c5b0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
c5c0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
c5d0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c5e0: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
c5f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
c600: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
c610: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
c620: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
c630: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
c640: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
c650: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
c660: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
c670: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
c680: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c690: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
c6a0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
c6b0: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
c6c0: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
c6d0: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
c6e0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
c6f0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
c700: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
c710: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c720: 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73  *jfd,.  i64 offs
c730: 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73  et,.  int useCks
c740: 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  um.){.  int rc;.
c750: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
c780: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
c790: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
c7c0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
c7d0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
c7e0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c800: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
c810: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
c820: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
c830: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
c840: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
c850: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
c860: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
c870: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
c880: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
c890: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
c8a0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
c8b0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
c8c0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
c8d0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
c8e0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
c8f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
c900: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
c910: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
c920: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
c930: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
c940: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
c950: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
c960: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
c970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
c980: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
c990: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
c9a0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
c9b0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
c9c0: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
c9d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c9e0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
c9f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
ca00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ca10: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
ca20: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
ca30: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
ca40: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
ca50: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
ca60: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
ca70: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
ca80: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
ca90: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
caa0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
cab0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
cac0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
cad0: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
cae0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
caf0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
cb00: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
cb10: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
cb20: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
cb30: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
cb40: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
cb50: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
cb60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
cb70: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
cb80: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
cb90: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
cba0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
cbb0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
cbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cbd0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
cbe0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
cbf0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
cc00: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
cc10: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
cc20: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
cc30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cc40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cc50: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
cc60: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
cc70: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
cc80: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
cc90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
cca0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
ccb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
ccc0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
ccd0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
cce0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ccf0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
cd00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
cd10: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
cd20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
cd30: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
cd40: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
cd50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
cd60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
cd70: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
cd80: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
cd90: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
cda0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
cdb0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
cdc0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
cdd0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
cde0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
cdf0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
ce00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ce10: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
ce20: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
ce30: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
ce40: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
ce50: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
ce60: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
ce70: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
ce80: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
ce90: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
cea0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ceb0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
cec0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
ced0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
cee0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
cef0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
cf00: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
cf10: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
cf20: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
cf30: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
cf40: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
cf50: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
cf60: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
cf70: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
cf80: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
cf90: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
cfa0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
cfb0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
cfc0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
cfd0: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
cfe0: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
cff0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d000: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
d010: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
d020: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
d030: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
d040: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
d050: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
d070: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
d080: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
d090: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
d0a0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
d0b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
d0c0: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
d0d0: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
d0e0: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
d0f0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
d100: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
d110: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
d120: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
d130: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
d140: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
d150: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
d160: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
d170: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
d180: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
d190: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
d1a0: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
d1b0: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
d1c0: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
d1d0: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
d1e0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
d1f0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
d200: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
d210: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
d220: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
d230: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
d240: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
d250: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
d260: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
d270: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
d280: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
d290: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
d2a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
d2b0: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
d2c0: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
d2d0: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
d2e0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
d2f0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
d300: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
d310: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
d320: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
d330: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
d340: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
d350: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
d360: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
d370: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
d380: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
d390: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
d3a0: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
d3b0: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
d3c0: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
d3d0: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
d3e0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
d3f0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
d400: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
d410: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
d420: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d430: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
d440: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
d450: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29  ->needSync==0) )
d460: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
d470: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
d480: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
d490: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
d4a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
d4b0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
d4c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
d4d0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  offset);.    if(
d4e0: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
d4f0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
d500: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
d510: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
d520: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
d530: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
d540: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
d550: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
d560: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
d570: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
d580: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
d590: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
d5a0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
d5b0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
d5c0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
d5d0: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
d5e0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
d5f0: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
d600: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
d610: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
d620: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
d630: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
d640: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
d650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
d660: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
d670: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
d680: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
d690: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
d6a0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
d6b0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
d6c0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
d6d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
d6e0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
d6f0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
d700: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
d710: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
d720: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d730: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
d740: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
d750: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
d760: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
d770: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
d780: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
d790: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
d7a0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
d7b0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
d7c0: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
d7d0: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
d7e0: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
d7f0: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
d800: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
d810: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
d820: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
d830: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
d840: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
d850: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
d860: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
d870: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
d880: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
d890: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
d8a0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
d8b0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
d8c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
d8d0: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
d8e0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
d8f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d900: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
d910: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
d920: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
d930: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d940: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
d950: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
d960: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
d970: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
d980: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
d990: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
d9a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
d9b0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
d9c0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
d9d0: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
d9e0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
d9f0: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
da00: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
da10: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
da20: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
da30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
da40: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
da50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
da60: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
da70: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
da80: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
da90: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
daa0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
dab0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
dac0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
dad0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
dae0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
daf0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
db00: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
db10: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
db20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
db30: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
db40: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
db50: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
db60: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
db70: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
db80: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
db90: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
dba0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
dbb0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
dbc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
dbd0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
dbe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
dbf0: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
dc00: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
dc10: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
dc20: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
dc30: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
dc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dc50: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
dc60: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
dc70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
dc80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dc90: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
dca0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
dcb0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
dcc0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
dcd0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
dce0: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
dcf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
dd00: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
dd10: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
dd20: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
dd30: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
dd40: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
dd50: 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73  3_malloc(pVfs->s
dd60: 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
dd70: 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
dd80: 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
dd90: 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
dda0: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
ddb0: 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
ddc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ddd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
dde0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
ddf0: 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
de00: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
de10: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
de20: 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
de30: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
de40: 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
de50: 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
de60: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
de70: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
de80: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
de90: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a  ster_open = 1;..
dea0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
deb0: 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
dec0: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
ded0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
dee0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
def0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
df00: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
df10: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
df20: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
df30: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
df40: 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  r = 0;.    int n
df50: 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67  MasterPtr = pPag
df60: 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
df70: 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20  name+1;..    /* 
df80: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
df90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dfa0: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
dfb0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
dfc0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
dfd0: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
dfe0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
dff0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
e000: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
e010: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
e020: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74  te3_malloc(nMast
e030: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
e040: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
e050: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
e060: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e070: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e080: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
e090: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
e0a0: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
e0b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
e0c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
e0d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e0e0: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
e0f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
e100: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
e110: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e120: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e130: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
e140: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
e150: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
e160: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
e170: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
e180: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
e190: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
e1a0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
e1b0: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
e1c0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
e1d0: 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20  ISTS) ){.       
e1e0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
e1f0: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
e200: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
e210: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
e220: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
e230: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
e240: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
e250: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e260: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
e270: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
e280: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
e290: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e2a0: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
e2b0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
e2c0: 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
e2d0: 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
e2e0: 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
e2f0: 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
e300: 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  L);.        rc =
e310: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
e320: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
e330: 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
e340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
e350: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e360: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
e370: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
e380: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e390: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
e3a0: 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
e3b0: 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
e3c0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
e3d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
e3e0: 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
e3f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e400: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e410: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
e420: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
e430: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
e440: 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
e450: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
e460: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
e470: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
e480: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
e490: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
e4a0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
e4b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e4c0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
e4d0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
e4e0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
e4f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e500: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
e510: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
e520: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
e530: 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
e540: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
e550: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
e560: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
e570: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
e580: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
e590: 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
e5a0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
e5b0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
e5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
e5d0: 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
e5e0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
e5f0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
e600: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
e610: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72  ic void pager_tr
e620: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67  uncate_cache(Pag
e630: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a  er *pPager);../*
e640: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
e650: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
e660: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
e670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
e680: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
e690: 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65  d. Also truncate
e6a0: 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72   the cached repr
e6b0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
e6c0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
e6d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
e6e0: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
e6f0: 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  er, int nPage){.
e700: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e710: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
e720: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
e730: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50  _EXCLUSIVE && pP
e740: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
e750: 64 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ds ){.    rc = s
e760: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
e770: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
e780: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
e790: 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20  64)nPage);.  }. 
e7a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e7b0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
e7c0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
e7d0: 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
e7e0: 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
e7f0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
e800: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
e810: 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65  t the sectorSize
e820: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
e830: 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ager..**.** The 
e840: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74  sector size is t
e850: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
e860: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
e870: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
e880: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
e890: 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69  ) and the pageSi
e8a0: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ze..*/.static vo
e8b0: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
e8c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
e8d0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
e8e0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
e8f0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e900: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
e910: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
e920: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
e930: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
e940: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
e950: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
e960: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
e970: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
e980: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
e990: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
e9a0: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
e9b0: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
e9c0: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
e9d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e9e0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
e9f0: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
ea00: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
ea10: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ea20: 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze<pPager->pageS
ea30: 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ize ){.    pPage
ea40: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
ea50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ea60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
ea70: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
ea80: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
ea90: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
eaa0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
eab0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
eac0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
ead0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
eae0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
eaf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
eb00: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
eb10: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
eb20: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
eb30: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
eb40: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
eb50: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
eb60: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
eb70: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
eb80: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
eb90: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
eba0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
ebb0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
ebc0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
ebd0: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
ebe0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
ebf0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
ec00: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
ec10: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
ec20: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
ec30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
ec40: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
ec50: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
ec60: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
ec70: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
ec80: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
ec90: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
eca0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
ecb0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
ecc0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
ecd0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ece0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
ecf0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
ed00: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
ed10: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
ed20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
ed30: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
ed40: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
ed50: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
ed60: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
ed70: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
ed80: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
ed90: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
eda0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
edb0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
edc0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
edd0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
ede0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
edf0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
ee00: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
ee10: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
ee20: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
ee30: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
ee40: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
ee50: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
ee60: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
ee70: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
ee80: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
ee90: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
eea0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
eeb0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
eec0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
eed0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
eee0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
eef0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
ef00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ef10: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
ef20: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
ef30: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
ef40: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
ef50: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
ef60: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
ef70: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
ef80: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
ef90: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
efa0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
efb0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
efc0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
efd0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
efe0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
eff0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
f000: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
f010: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
f020: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
f030: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
f040: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
f050: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
f060: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
f070: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
f080: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
f090: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
f0a0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
f0b0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
f0c0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
f0d0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
f0e0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
f0f0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
f100: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f110: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
f120: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
f130: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
f140: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
f150: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
f160: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
f170: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
f180: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
f190: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
f1a0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
f1b0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
f1c0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
f1d0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
f1e0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
f1f0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
f200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
f210: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
f220: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
f230: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
f240: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
f250: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
f260: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
f270: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
f280: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
f290: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
f2a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
f2b0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
f2c0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
f2d0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
f2e0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
f2f0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
f300: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
f310: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
f320: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
f330: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
f340: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
f350: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
f360: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
f370: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
f380: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
f390: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
f3a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
f3b0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
f3c0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
f3d0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
f3e0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
f3f0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
f400: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f410: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
f420: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
f430: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
f440: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
f450: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
f460: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
f470: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
f480: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
f490: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
f4a0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
f4b0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
f4c0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
f4d0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
f4e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f4f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f500: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f510: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
f520: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
f530: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
f540: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
f550: 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
f560: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
f570: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f590: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f5a0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
f5b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f5c0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
f5d0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
f5e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f600: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
f610: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
f620: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f630: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
f640: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
f650: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
f660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
f670: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
f680: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
f690: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
f6a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f6b0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
f6c0: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
f6d0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
f6e0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
f6f0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
f700: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
f710: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
f720: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
f730: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f740: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f750: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
f760: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
f770: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
f780: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
f790: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
f7a0: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
f7b0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
f7c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
f7d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
f7e0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
f7f0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
f800: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
f810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f820: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
f830: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
f840: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
f850: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
f860: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
f870: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
f880: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
f890: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
f8a0: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
f8b0: 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
f8c0: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
f8d0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
f8e0: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
f8f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
f900: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
f910: 61 6d 65 2b 31 29 3b 0a 20 20 61 73 73 65 72 74  ame+1);.  assert
f920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f930: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
f940: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20  QLITE_OK .   || 
f950: 28 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21  (zMaster[0] && !
f960: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
f970: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
f980: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
f990: 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20 20 20  STS)) .  ){.    
f9a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
f9b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f9c0: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
f9d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
f9e0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
f9f0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
fa00: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7a 4d  nalOff = 0;.  zM
fa10: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  aster = 0;..  /*
fa20: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
fa30: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
fa40: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
fa50: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
fa60: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
fa70: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
fa80: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
fa90: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
faa0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
fab0: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
fac0: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
fad0: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
fae0: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
faf0: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
fb00: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
fb10: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
fb20: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
fb30: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
fb40: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
fb50: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
fb60: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
fb70: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
fb80: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
fb90: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
fba0: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
fbb0: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
fbc0: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
fbd0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
fbe0: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
fbf0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fc00: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
fc10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fc20: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
fc30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
fc50: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
fc60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
fc70: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
fc80: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
fc90: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
fca0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
fcb0: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
fcc0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
fcd0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
fce0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
fcf0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
fd00: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
fd10: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
fd20: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
fd30: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
fd40: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
fd50: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
fd60: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
fd70: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
fd80: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
fd90: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
fda0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
fdb0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
fdc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
fdd0: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
fde0: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
fdf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
fe00: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
fe10: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
fe20: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
fe30: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
fe40: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
fe50: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
fe60: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
fe70: 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
fe80: 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
fe90: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
fea0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
feb0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
fec0: 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
fed0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
fee0: 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
fef0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
ff00: 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
ff10: 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
ff20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ff30: 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
ff40: 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
ff50: 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
ff60: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
ff70: 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
ff80: 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
ff90: 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
ffa0: 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
ffb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
ffc0: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
ffd0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
ffe0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
fff0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10000 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
10010 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
10020 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
10030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10040 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
10050 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
10060 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
10070 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
10080 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
10090 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
100a0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
100b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
100c0 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
100d0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
100e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
100f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
10100 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10110 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
10120 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
10130 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
10140 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10160 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10170 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
10180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
10190 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
101a0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
101b0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
101c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
101d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
101e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
101f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
10200 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
10210 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
10220 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
10230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10240 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
10250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10260 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10270 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
10280 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
102a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
102b0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
102c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
102d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
102e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
102f0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
10300 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10310 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
10320 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
10330 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
10340 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
10350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10360 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
10370 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
10380 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
10390 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
103a0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
103b0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
103c0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
103d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
103e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
103f0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
10400 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
10410 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
10420 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
10430 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  r[0] ){.    /* I
10440 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
10450 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
10460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
10470 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
10480 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
10490 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
104a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
104b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
104c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
104d0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
104e0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
104f0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
10500 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
10510 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
10520 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
10530 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
10540 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
10550 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
10560 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
10570 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
10580 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
10590 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
105a0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
105b0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
105c0 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
105d0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
105e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
105f0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
10600 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
10610 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
10620 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
10630 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
10640 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
10650 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
10660 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
10670 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10680 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10690 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
106a0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
106b0 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
106c0 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
106d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
106e0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
106f0 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
10700 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
10710 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
10720 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
10730 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
10740 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
10750 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
10760 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
10770 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
10780 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10790 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
107a0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
107b0 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
107c0 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
107d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
107e0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
107f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
10800 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
10810 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10820 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
10830 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
10840 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
10870 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
108a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
108b0 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
108c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
108d0 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
108e0 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
108f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10900 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10910 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
10920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10930 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
10940 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
10950 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
10960 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10970 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
10980 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75  be the offset ju
10990 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  st after the end
109a0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75   of the last jou
109b0 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77  rnal.  ** page w
109c0 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68  ritten before th
109d0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
109e0 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  header for this 
109f0 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
10a00 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77  ransaction was w
10a10 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65  ritten, or the e
10a20 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
10a30 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
10a40 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
10a50 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
10a60 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
10a70 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
10a80 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
10a90 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
10aa0 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
10ab0 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
10ac0 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
10ad0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
10ae0 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
10af0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
10b00 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
10b10 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
10b20 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
10b30 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  mtSize);.  asser
10b40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
10b50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
10b60 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
10b70 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
10b80 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
10b90 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
10ba0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10bb0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
10bc0 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
10bd0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e  urnalOpen );.  n
10be0 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
10bf0 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
10c00 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
10c10 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
10c20 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
10c30 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
10c40 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
10c50 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
10c60 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
10c70 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
10c80 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
10c90 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
10ca0 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
10cb0 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
10cc0 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
10cd0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
10ce0 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
10cf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
10d00 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  i++){.    i64 of
10d10 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67  fset = i*(4+pPag
10d20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
10d30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
10d40 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
10d50 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
10d60 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29  stfd, offset, 0)
10d70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
10d80 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
10d90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10da0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
10db0 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
10dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
10dd0 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
10de0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
10df0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
10e00 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
10e10 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
10e20 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
10e30 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
10e40 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
10e50 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
10e60 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
10e70 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
10e80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
10e90 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
10ea0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
10eb0 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
10ec0 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
10ed0 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
10ee0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
10ef0 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
10f00 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
10f10 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
10f20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
10f30 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
10f40 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
10f50 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10f60 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  on..  */.  pPage
10f70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10f80 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
10f90 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
10fa0 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
10fb0 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68  >stmtCksum;.  wh
10fc0 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
10fd0 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66  rnalOff < hdrOff
10fe0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
10ff0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
11000 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11010 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
11030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
11040 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
11050 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11060 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
11070 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
11080 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70  .  }..  while( p
11090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
110a0 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75  f < szJ ){.    u
110b0 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20  32 nJRec;       
110c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
110d0 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
110e0 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
110f0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
11100 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
11110 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
11120 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
11130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11150 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
11160 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
11170 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
11180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52     }.    if( nJR
11190 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
111a0 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  JRec = (szJ - pP
111b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
111c0 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67  ) / (pPager->pag
111d0 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a  eSize+8);.    }.
111e0 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d      for(i=nJRec-
111f0 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65  1; i>=0 && pPage
11200 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
11210 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  szJ; i--){.     
11220 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11230 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11240 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
11250 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11260 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20  alOff, 1);.     
11270 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
11280 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
11290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
112a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
112b0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
112c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
112d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
112e0 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
112f0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
11300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
11310 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11320 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
11330 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
11340 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
11350 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
11360 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11370 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
11380 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
11390 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
113a0 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
113b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
113c0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
113d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
113e0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
113f0 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
11400 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
11410 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
11420 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
11430 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
11440 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
11450 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
11460 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11470 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
11480 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
11490 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
114a0 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
114b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
114c0 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
114d0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
114e0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
114f0 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
11500 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
11510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11520 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
11530 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
11540 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
11560 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
11570 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
11580 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
11590 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
115a0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
115b0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
115c0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
115d0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
115e0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
115f0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
11600 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
11620 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
11630 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
11640 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
11650 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
11660 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
11670 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
11680 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
11690 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
116a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
116b0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
116c0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
116d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
116e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
116f0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
11700 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
11710 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
11720 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
11730 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
11740 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
11750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11760 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
11770 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
11780 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
11790 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
117b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
117c0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
117d0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
117e0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
117f0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
11800 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
11810 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
11820 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
11830 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
11840 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
11850 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
11860 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11870 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
11880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
11890 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
118a0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
118b0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
118c0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
118d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
118e0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
118f0 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
11900 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
11910 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
11920 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
11930 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
11940 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
11950 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11960 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
11970 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
11980 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
11990 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
119a0 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
119b0 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  _fsync){.  pPage
119c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
119d0 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
119e0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
119f0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
11a00 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
11a10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
11a20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
11a30 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e  ags = (full_fsyn
11a40 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
11a50 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
11a60 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50  ORMAL);.  if( pP
11a70 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
11a80 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
11a90 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
11aa0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
11ab0 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
11ac0 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
11ad0 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
11ae0 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
11af0 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
11b00 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
11b10 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
11b20 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
11b30 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
11b40 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
11b50 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11b60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
11b70 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
11b80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
11b90 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
11ba0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
11bb0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
11bc0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
11bd0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
11be0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
11bf0 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
11c00 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
11c10 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
11c20 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
11c30 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
11c40 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65  rary.** file whe
11c50 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
11c60 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
11c70 6d 65 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e  me is 0, then an
11c80 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 65 6d   appropriate tem
11c90 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 20  porary filename 
11ca0 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
11cb0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 6e  automatically an
11cc0 64 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d  SQLITE_OPEN_S
11cd0 55 42 4a 4f 55 52 4e 41 4c 20 69 73 20 70 61 73  UBJOURNAL is pas
11ce0 73 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 4f 53  sed to.** the OS
11cf0 20 6c 61 79 65 72 20 61 73 20 74 68 65 20 66 69   layer as the fi
11d00 6c 65 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 49  le type..**.** I
11d10 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 6e  f zFilename is n
11d20 6f 74 20 30 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ot 0, SQLITE_OPE
11d30 4e 5f 54 45 4d 50 5f 44 42 20 69 73 20 70 61 73  N_TEMP_DB is pas
11d40 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
11d50 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
11d60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11d70 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69  Opentemp(.  sqli
11d80 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
11d90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
11da0 70 46 69 6c 65 2c 20 0a 20 20 63 68 61 72 20 2a  pFile, .  char *
11db0 7a 46 69 6c 65 6e 61 6d 65 0a 29 7b 0a 20 20 69  zFilename.){.  i
11dc0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61  nt rc;.  int fla
11dd0 67 73 20 3d 20 28 0a 20 20 20 20 20 53 51 4c 49  gs = (.     SQLI
11de0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11df0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
11e00 45 41 54 45 7c 0a 20 20 20 20 20 53 51 4c 49 54  EATE|.     SQLIT
11e10 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11e20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  |SQLITE_OPEN_DEL
11e30 45 54 45 4f 4e 43 4c 4f 53 45 0a 20 20 29 3b 0a  ETEONCLOSE.  );.
11e40 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d  .  char *zFree =
11e50 20 30 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   0;.  if( zFilen
11e60 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46  ame==0 ){.    zF
11e70 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ree = (char *)sq
11e80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66  lite3_malloc(pVf
11e90 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a  s->mxPathname);.
11ea0 20 20 20 20 69 66 28 20 21 7a 46 72 65 65 20 29      if( !zFree )
11eb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
11ec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11ed0 20 7d 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65   }.    zFilename
11ee0 20 3d 20 7a 46 72 65 65 3b 0a 20 20 20 20 66 6c   = zFree;.    fl
11ef0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
11f00 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 3b 0a 20  EN_SUBJOURNAL;. 
11f10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11f20 73 47 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66  sGetTempName(pVf
11f30 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  s, zFilename);. 
11f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11f60 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65  lite3_free(zFree
11f70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11f80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
11f90 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e{.    flags |= 
11fa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
11fb0 5f 44 42 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  _DB;.  }..#ifdef
11fc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
11fd0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
11fe0 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
11ff0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
12000 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
12010 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20  */.#endif..  rc 
12020 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
12030 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
12040 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30   pFile, flags, 0
12050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
12060 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46  =SQLITE_OK || pF
12070 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  ile->pMethods );
12080 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12090 7a 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e  zFree);.  return
120a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
120b0 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
120c0 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
120d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
120e0 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
120f0 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
12100 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
12110 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
12120 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
12130 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
12140 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
12150 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
12160 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
12170 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
12180 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
12190 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
121a0 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
121b0 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
121c0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
121d0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
121e0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
121f0 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
12200 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
12210 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
12220 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
12230 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
12240 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
12250 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
12260 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
12270 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12280 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
12290 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
122a0 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
122b0 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
122c0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
122d0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
122e0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
122f0 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
12300 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
12310 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
12320 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
12330 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
12340 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
12350 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
12360 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
12370 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
12380 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
12390 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
123a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
123b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
123c0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
123d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
123e0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
123f0 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
12400 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
12410 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
12420 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
12430 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
12440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
12450 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
12460 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
12470 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
12480 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
12490 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
124a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
124b0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
124c0 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
124d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
124e0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
124f0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
12500 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
12510 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
12520 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
12530 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
12540 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
12550 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
12560 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
12570 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
12580 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c  );.  int nDefaul
12590 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44  tPage = SQLITE_D
125a0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
125b0 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  ;.  char *zPathn
125c0 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ame;.  int nPath
125d0 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  name;..  /* The 
125e0 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69  default return i
125f0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
12600 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
12610 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
12620 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
12630 61 6d 65 20 2a 2f 0a 20 20 7a 50 61 74 68 6e 61  ame */.  zPathna
12640 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
12650 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  loc(pVfs->mxPath
12660 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 7a  name+1);.  if( z
12670 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
12680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12690 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
126a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
126b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
126c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
126d0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
126e0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
126f0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
12700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
12710 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
12720 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
12730 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
12740 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
12750 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
12760 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
12770 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
12780 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  me);.    }.  }el
12790 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
127a0 69 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d  ite3OsGetTempNam
127b0 65 28 70 56 66 73 2c 20 7a 50 61 74 68 6e 61 6d  e(pVfs, zPathnam
127c0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
127d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
127e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
127f0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
12800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12810 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72   nPathname = str
12820 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  len(zPathname);.
12830 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
12840 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
12850 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
12860 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
12870 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
12880 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
12890 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
128a0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
128b0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
128c0 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20  FileSize +      
128d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
128e0 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75  nal file structu
128f0 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d  re */ .    pVfs-
12900 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b 20  >szOsFile * 2 + 
12910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62         /* The db
12920 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e 61   and stmt journa
12930 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
12940 6e 50 61 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20  nPathname * 3 + 
12950 33 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  30          /* z
12960 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
12970 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a  tory, zJournal *
12980 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50  /.  );.  if( !pP
12990 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ager ){.    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 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
129c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
129d0 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  }.  pPtr = (u8 *
129e0 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
129f0 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c  Pager->fd = (sql
12a00 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
12a10 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
12a20 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  0];.  pPager->st
12a30 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
12a40 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
12a50 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70  szOsFile*1];.  p
12a60 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71  Pager->jfd = (sq
12a70 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
12a80 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
12a90 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  *2];.  pPager->z
12aa0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
12ab0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
12ac0 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c  OsFile*2+journal
12ad0 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
12ae0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
12af0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
12b00 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
12b10 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
12b20 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
12b30 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
12b40 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
12b50 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
12b60 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
12b70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
12b80 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
12b90 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e+1);.  sqlite3_
12ba0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
12bb0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
12bc0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
12bd0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
12be0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
12bf0 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
12c00 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e    if( nPathname>
12c10 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
12c20 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  e - sizeof("-jou
12c30 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20  rnal")) ){.     
12c40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
12c50 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  TOPEN;.    }else
12c60 7b 0a 2f 2a 2a 2a 20 20 46 49 58 4d 45 3a 20 20  {./***  FIXME:  
12c70 4d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  Might need to be
12c80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
12c90 50 5f 44 42 2e 20 20 4e 65 65 64 20 74 6f 20 70  P_DB.  Need to p
12ca0 61 73 73 20 69 6e 0a 2a 2a 2a 2a 20 61 20 66 6c  ass in.**** a fl
12cb0 61 67 20 66 72 6f 6d 20 68 69 67 68 65 72 20 75  ag from higher u
12cc0 70 2e 0a 2a 2a 2a 2a 2f 0a 20 20 20 20 20 20 69  p..****/.      i
12cd0 6e 74 20 6f 66 6c 61 67 20 3d 20 0a 20 20 20 20  nt oflag = .    
12ce0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
12cf0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
12d00 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
12d10 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
12d20 49 4e 5f 44 42 29 3b 0a 20 20 20 20 20 20 69 6e  IN_DB);.      in
12d30 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
12d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12d50 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
12d60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
12d70 61 67 65 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c  ager->fd, oflag,
12d80 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
12d90 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
12da0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12db0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
12dc0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
12dd0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
12de0 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
12df0 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
12e00 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
12e10 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
12e20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
12e30 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
12e40 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
12e50 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
12e60 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
12e70 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
12e80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
12e90 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
12ea0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
12eb0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
12ec0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12ed0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
12ee0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
12ef0 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
12f00 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
12f10 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
12f20 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
12f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
12f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
12f50 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
12f60 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
12f70 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
12f80 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
12f90 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
12fa0 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61    if( nDefaultPa
12fb0 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  ge<iSectorSize )
12fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
12fd0 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74  aultPage = iSect
12fe0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
12ff0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
13000 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
13010 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
13020 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
13030 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
13040 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
13050 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
13060 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
13070 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13080 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
13090 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
130a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
130b0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
130c0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
130d0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
130e0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
130f0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
13100 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
13110 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13120 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20  i=nDefaultPage; 
13130 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
13140 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13150 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
13160 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
13170 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
13180 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20  OMIC|(ii>>8)) ) 
13190 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69  nDefaultPage = i
131a0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
131b0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
131c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
131d0 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f  aultPage>SQLITE_
131e0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
131f0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
13200 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20     nDefaultPage 
13210 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  = SQLITE_MAX_DEF
13220 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
13230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13240 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
13250 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
13260 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
13270 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
13280 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
13290 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
132a0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
132b0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
132c0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
132d0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
132e0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
132f0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
13300 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
13310 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
13320 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20  ite()..    */ . 
13330 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
13340 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
13350 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
13360 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SIVE;.  }..  if(
13370 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
13380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13390 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
133a0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
133b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61  te3_malloc(nDefa
133c0 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  ultPage);.  }.. 
133d0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
133e0 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
133f0 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
13400 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65  above..  ** Free
13410 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
13420 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
13430 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69  he file..  ** Si
13440 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
13450 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
13460 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
13470 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
13480 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
13490 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
134a0 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
134b0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
134c0 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
134d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
134e0 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
134f0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
13500 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
13510 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
13520 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
13530 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
13540 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
13550 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
13560 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
13570 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
13580 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
13590 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
135a0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
135b0 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ame))..  /* Fill
135c0 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63   in Pager.zDirec
135d0 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  tory[] */.  memc
135e0 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
135f0 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a  ctory, pPager->z
13600 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13610 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ame+1);.  for(i=
13620 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a  strlen(pPager->z
13630 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20  Directory); i>0 
13640 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
13650 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
13660 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
13670 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
13680 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
13690 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
136a0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
136b0 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  */.  memcpy(pPag
136c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
136d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
136e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d   nPathname);.  m
136f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
13700 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
13710 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
13720 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72  9);..  /* pPager
13730 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13740 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13750 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
13760 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
13770 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
13780 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
13790 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
137a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
137b0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
137c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
137d0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
137e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
137f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
13800 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
13810 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
13820 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61 75  ageSize = nDefau
13830 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61  ltPage;.  /* pPa
13840 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
13850 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
13860 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
13870 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
13880 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
13890 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
138a0 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
138b0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
138c0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
138d0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
138e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
138f0 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
13900 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
13910 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
13920 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
13930 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
13940 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
13950 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
13960 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
13970 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
13980 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
13990 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
139a0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
139b0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
139c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
139d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
139e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
139f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
13a00 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
13a10 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13a20 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65  eMode = tempFile
13a30 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
13a40 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
13a50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
13a60 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
13a70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
13a80 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
13a90 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
13aa0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
13ab0 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
13ac0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
13ad0 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
13ae0 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
13af0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
13b00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
13b10 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
13b20 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
13b30 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
13b40 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
13b50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
13b60 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
13b70 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
13b80 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
13b90 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
13ba0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
13bb0 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65  thods||memDb||te
13bc0 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
13bd0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74  memDb ){.    set
13be0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
13bf0 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  r);.  }.  /* pPa
13c00 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13c10 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
13c20 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
13c30 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
13c40 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
13c50 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
13c60 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
13c70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
13c80 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
13c90 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
13ca0 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  M = 0;.  pPager-
13cb0 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20  >iInUseDB = 0;. 
13cc0 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
13cd0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13ce0 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
13cf0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
13d00 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
13d10 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
13d20 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13d30 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61  (mutex);.    pPa
13d40 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c  ger->pNext = sql
13d50 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20  ite3PagerList;. 
13d60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13d70 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  gerList ){.     
13d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13d90 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
13da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
13db0 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
13dc0 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20  Prev = pPager;. 
13dd0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
13de0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
13df0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
13e00 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73   = pPager;.    s
13e10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13e20 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
13e30 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
13e40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13e50 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
13e60 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
13e70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13e80 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
13e90 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
13ea0 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
13eb0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
13ec0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
13ed0 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
13ee0 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
13ef0 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
13f00 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
13f10 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
13f20 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
13f30 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
13f40 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
13f50 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
13f60 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
13f70 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
13f80 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
13f90 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
13fa0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
13fb0 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
13fc0 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
13fd0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
13fe0 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
13ff0 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
14000 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
14010 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
14020 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
14030 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
14040 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
14050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14060 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
14070 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
14080 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
14090 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
140a0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
140b0 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
140c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
140d0 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
140e0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
140f0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
14100 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
14110 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
14120 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
14130 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
14140 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
14150 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
14160 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
14170 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
14180 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
14190 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
141a0 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
141b0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
141c0 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
141d0 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
141e0 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
141f0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
14200 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14210 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
14220 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
14230 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
14240 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
14250 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
14260 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
14270 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
14280 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  ize to *pPageSiz
14290 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73  e. If the sugges
142a0 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  t new page size 
142b0 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69  is.** inappropri
142c0 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
142d0 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
142e0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61  ze is set to tha
142f0 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72  t.** value befor
14300 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
14310 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
14320 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
14330 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
14340 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
14350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14360 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a 65  ;.  u16 pageSize
14370 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
14380 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
14390 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
143a0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
143b0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
143c0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
143d0 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
143e0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
143f0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26  >pageSize .   &&
14400 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
14410 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
14420 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0 .  ){.    cha
14430 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
14440 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
14450 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
14460 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
14470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14480 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
14490 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74 65  .      pagerEnte
144a0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
144b0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
144c0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
144d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
144e0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
144f0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14500 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14510 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
14520 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
14530 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
14540 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
14550 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
14560 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
14570 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
14580 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14590 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
145a0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
145b0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
145c0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
145d0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
145e0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
145f0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
14600 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
14610 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
14620 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
14630 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
14640 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
14650 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
14660 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
14670 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
14680 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
14690 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
146a0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
146b0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
146c0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
146d0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
146e0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
146f0 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
14700 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
14710 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
14720 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
14730 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
14740 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
14750 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
14760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14770 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
14780 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
14790 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
147a0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
147b0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
147c0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
147d0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
147e0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
147f0 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
14800 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
14810 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
14820 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
14830 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
14840 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
14850 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
14860 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
14870 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
14880 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14890 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
148a0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
148b0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
148c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
148d0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
148e0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
148f0 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
14900 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
14910 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
14920 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
14930 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14940 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
14950 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
14960 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
14970 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
14980 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
14990 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
149a0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
149b0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
149c0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
149d0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
149e0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
149f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
14a00 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
14a10 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
14a20 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
14a30 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
14a40 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
14a50 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
14a60 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
14a70 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
14a80 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
14a90 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
14aa0 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
14ab0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
14ac0 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
14ad0 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
14ae0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
14af0 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
14b00 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
14b10 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
14b20 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
14b30 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
14b40 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
14b50 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
14b60 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
14b70 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
14b80 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
14b90 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
14ba0 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
14bb0 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
14bc0 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
14bd0 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
14be0 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
14bf0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
14c00 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
14c10 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14c20 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
14c30 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
14c40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14c50 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
14c60 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
14c70 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d  t(MEMDB||pPager-
14c80 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
14c90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
14ca0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14cb0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
14cc0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
14cd0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
14ce0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
14cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
14d00 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
14d10 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
14d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14d30 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
14d40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14d50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14d80 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
14d90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
14da0 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
14db0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
14dc0 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
14dd0 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
14de0 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
14df0 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
14e00 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
14e10 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
14e20 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
14e30 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
14e40 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
14e50 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
14e60 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
14e70 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
14e80 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
14e90 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
14ea0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
14eb0 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
14ec0 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
14ed0 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
14ee0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
14ef0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
14f00 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b  r){.  i64 n = 0;
14f10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
14f20 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
14f30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14f40 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
14f50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
14f60 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14f70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e>=0 ){.    n = 
14f80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
14f90 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61    } else {.    a
14fa0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
14fb0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
14fc0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
14fd0 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
14fe0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20  fd->pMethods).  
14ff0 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
15000 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
15010 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
15020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15030 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
15040 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
15050 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
15060 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
15070 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
15080 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
15090 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
150a0 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
150b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
150c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
150d0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
150e0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
150f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15100 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
15110 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
15120 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
15130 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
15140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50  ;.  }.  if( n>pP
15150 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
15160 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
15170 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  no = n;.  }.  re
15180 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e  turn n;.}...#ifn
15190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
151a0 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
151b0 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
151c0 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
151d0 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
151e0 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
151f0 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ist){.  sqlite3_
15200 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  free(pHist->pOri
15210 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
15220 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
15230 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
15240 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
15250 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
15260 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
15270 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
15280 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
15290 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
152a0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
152b0 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
152c0 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  /*.** Unlink pPg
152d0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
152e0 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
152f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15300 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
15310 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
15320 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
15330 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
15340 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
15350 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
15360 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
15370 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
15380 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
15390 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
153a0 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
153b0 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
153c0 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
153d0 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
153e0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
153f0 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
15400 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
15410 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
15420 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
15430 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
15440 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
15450 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
15460 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15470 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
15480 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
15490 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
154a0 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
154b0 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
154c0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
154d0 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
154e0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
154f0 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
15500 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d  ger->nHash-1)]!=
15510 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
15520 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
15530 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
15540 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
15550 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d      int h = pPg-
15560 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
15570 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70  >nHash-1);.    p
15580 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
15590 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
155a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
155b0 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69  B ){.    clearHi
155c0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
155d0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
155e0 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
155f0 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
15600 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
15610 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
15620 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
15630 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15640 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
15650 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
15660 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
15670 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
15680 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
15690 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
156a0 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
156b0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
156c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
156d0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
156e0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65   Unlink from fre
156f0 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  e page list */. 
15700 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
15710 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  Pg);..  /* Unlin
15720 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
15730 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
15740 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
15750 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
15760 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15770 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
15780 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
15790 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
157a0 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
157b0 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
157c0 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
157d0 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
157e0 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
157f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
15800 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
15810 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
15820 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
15830 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
15840 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
15850 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
15860 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
15870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
15880 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
15890 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
158a0 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
158b0 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
158c0 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
158d0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
158e0 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
158f0 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
15900 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
15910 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
15920 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
15930 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
15940 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
15950 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
15960 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
15970 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
15980 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
15990 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
159a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
159b0 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
159c0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
159d0 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
159e0 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
159f0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
15a00 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
15a10 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
15a20 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
15a30 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
15a40 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
15a50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15a60 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
15a70 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
15a80 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
15a90 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
15aa0 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
15ab0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
15ac0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
15ad0 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
15ae0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
15af0 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
15b00 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
15b10 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
15b20 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
15b30 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
15b40 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
15b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15b60 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
15b70 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
15b80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15b90 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
15ba0 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
15bb0 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
15bc0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
15bd0 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
15be0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
15bf0 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
15c00 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
15c10 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
15c20 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
15c30 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
15c40 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
15c50 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
15c60 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
15c70 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
15c80 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
15c90 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
15ca0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
15cb0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
15cc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
15cd0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
15ce0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
15cf0 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
15d00 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
15d10 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
15d20 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
15d30 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
15d40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15d50 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
15d60 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
15d70 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
15d80 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
15d90 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
15da0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
15db0 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
15dc0 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
15dd0 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
15de0 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
15df0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15e00 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
15e10 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
15e20 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
15e30 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
15e40 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
15e50 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
15e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
15e70 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
15e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15e90 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
15ea0 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
15eb0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
15ec0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
15ed0 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
15ee0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
15ef0 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
15f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
15f20 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
15f30 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
15f40 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
15f50 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
15f60 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
15f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
15f90 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
15fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
15fb0 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
15fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15fd0 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
15fe0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
15ff0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
16000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16010 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
16020 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
16030 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16040 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
16050 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16060 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
16070 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
16080 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
16090 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
160a0 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
160b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
160c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
160d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
160e0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
160f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
16100 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
16110 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
16120 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
16130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16140 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
16150 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
16160 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
16170 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
16180 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
16190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
161a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
161b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
161c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
161d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
161e0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
161f0 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
16200 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
16210 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16220 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
16230 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16240 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
16250 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
16260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16280 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
16290 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
162a0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
162b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
162c0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
162d0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
162e0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
162f0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
16300 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
16310 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
16320 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
16330 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
16340 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
16350 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
16360 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
16370 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
16380 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
16390 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
163a0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
163b0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
163c0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
163d0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
163e0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
163f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
16400 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
16410 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
16420 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
16430 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
16440 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
16450 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
16460 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
16470 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
16480 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
16490 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
164a0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
164b0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
164c0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
164d0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
164e0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
164f0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
16500 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
16510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16520 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
16530 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
16540 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
16550 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
16560 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
16570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
16580 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69  ex *mutex = sqli
16590 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
165a0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
165b0 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73  TIC_MEM2);.    s
165c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
165d0 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  er(mutex);.    i
165e0 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76  f( pPager->pPrev
165f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16600 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
16610 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
16620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16630 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
16640 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
16650 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
16660 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29   pPager->pNext )
16670 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
16680 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16690 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20  Pager->pPrev;.  
166a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
166b0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
166c0 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  x);.  }.#endif..
166d0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
166e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
166f0 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
16700 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
16710 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
16720 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
16730 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
16740 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
16750 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
16760 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
16770 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
16780 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
16790 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
167a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
167b0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
167c0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
167d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
167e0 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
167f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
16800 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
16810 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
16820 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
16830 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
16840 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
16850 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
16860 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16870 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
16880 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
16890 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
168a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
168b0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
168c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
168d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
168e0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
168f0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
16900 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
16910 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
16920 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
16930 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
16940 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
16950 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
16960 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
16970 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
16980 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
16990 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
169a0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
169b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
169c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
169d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
169e0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
169f0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
16a00 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
16a10 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
16a20 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
16a30 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
16a40 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
16a50 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
16a60 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
16a70 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
16a80 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
16a90 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
16aa0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
16ab0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
16ac0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
16ad0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
16ae0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
16af0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
16b00 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
16b10 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
16b20 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
16b30 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
16b40 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
16b50 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
16b60 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
16b70 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
16b80 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
16b90 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
16ba0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
16bb0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
16bc0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
16bd0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
16be0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
16bf0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
16c00 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
16c10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16c20 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
16c30 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
16c40 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
16c50 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
16c60 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
16c70 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
16c80 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c  ove it. */.    l
16c90 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16ca0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
16cb0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
16cc0 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
16cd0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
16ce0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
16cf0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
16d00 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
16d10 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
16d20 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
16d30 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
16d40 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
16d50 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
16d60 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
16d70 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
16d80 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
16d90 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
16da0 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
16db0 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
16dc0 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
16dd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
16de0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
16df0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
16e00 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
16e10 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
16e20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
16e30 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
16e40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
16e50 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
16e60 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  {.  pagerEnter(p
16e70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70  Pg->pPager);.  p
16e80 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
16e90 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e  pagerLeave(pPg->
16ea0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
16eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16ec0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
16ed0 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
16ee0 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
16ef0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
16f00 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
16f10 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16f20 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
16f30 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
16f40 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
16f50 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
16f60 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
16f70 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
16f80 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
16f90 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
16fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
16fb0 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
16fc0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
16fd0 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
16fe0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
16ff0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
17000 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
17010 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
17020 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
17030 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
17040 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
17050 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
17060 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
17070 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
17080 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
17090 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
170a0 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
170b0 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
170c0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
170d0 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
170e0 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
170f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
17100 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
17110 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
17120 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
17130 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
17140 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
17150 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
17160 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
17170 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
17180 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
17190 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
171a0 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
171b0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
171c0 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
171d0 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
171e0 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
171f0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
17200 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
17210 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
17220 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
17230 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
17240 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e  ilure, so no syn
17250 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
17260 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
17270 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20  UENTIAL flag is 
17280 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73  set for the pers
17290 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20  istent media on 
172a0 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74  which.** the dat
172b0 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c  abase is stored,
172c0 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69   then OsSync() i
172d0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  s never called o
172e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
172f0 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63   file. In this c
17300 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20  ase all that is 
17310 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 75  required is to u
17320 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66  pdate the nRec f
17330 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a  ield in.** the j
17340 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a  ournal header..*
17350 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17360 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
17370 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
17380 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
17390 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
173a0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
173b0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
173c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
173d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
173e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
173f0 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  K;...  /* Sync t
17400 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
17410 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
17420 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
17430 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
17440 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
17450 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
17460 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
17470 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
17480 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
17490 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
174a0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  File ){.      in
174b0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
174c0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
174d0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
174e0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
174f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17500 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20  lOpen );..      
17510 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
17520 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
17530 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
17540 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
17550 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
17560 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
17570 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
17580 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
17590 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
175a0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
175b0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
175c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
175d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
175e0 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
175f0 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
17600 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
17610 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
17620 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
17630 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
17640 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17650 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20    i64 jSz;.     
17660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17670 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
17680 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
17690 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
176a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
176b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
176c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
176d0 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
176e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
176f0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
17700 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
17710 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
17720 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
17730 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
17740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
17750 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
17760 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
17770 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
17780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
17790 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
177a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
177b0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
177c0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
177d0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
177e0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
177f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
17800 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
17810 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
17820 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
17830 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
17840 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
17850 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
17860 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
17870 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
17880 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
17890 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
178a0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
178b0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
178c0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
178d0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
178e0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
178f0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
17900 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
17910 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
17920 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
17930 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
17940 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
17950 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
17960 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
17970 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17980 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66       i64 jrnlOff
17990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
179a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
179b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
179c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
179d0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
179e0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
179f0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
17a00 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17a10 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
17a20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
17a30 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
17a40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
17a50 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
17a60 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
17a70 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
17a80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
17a90 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
17aa0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17ab0 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61     jrnlOff = pPa
17ac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
17ad0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
17ae0 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20  lMagic);.       
17af0 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
17b00 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
17b10 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20  Pager, jrnlOff, 
17b20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  4));.        rc 
17b30 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
17b40 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
17b50 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ff, pPager->nRec
17b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17b70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
17b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17b90 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
17ba0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
17bb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
17bc0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
17bd0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
17be0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
17bf0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
17c00 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
17c10 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
17c20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17c30 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
17c40 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
17c50 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
17c60 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
17c70 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
17c80 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
17c90 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
17ca0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
17cb0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
17cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17cd0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
17ce0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
17cf0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
17d00 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
17d10 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
17d20 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
17d30 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
17d40 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
17d50 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
17d60 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
17d70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
17d80 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
17d90 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
17da0 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73    lruListSetFirs
17db0 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b  tSynced(pPager);
17dc0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
17dd0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
17de0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
17df0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
17e00 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
17e10 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
17e20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
17e30 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
17e40 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
17e50 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
17e60 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
17e70 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
17e80 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
17e90 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
17ea0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
17eb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
17ec0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
17ed0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
17ee0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
17ef0 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
17f00 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b 0a  ->lru.pFirst );.
17f10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
17f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17f30 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
17f40 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
17f50 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
17f60 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
17f70 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
17f80 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
17f90 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
17fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
17fb0 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
17fc0 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
17fd0 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
17fe0 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
17ff0 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
18000 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
18010 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
18020 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
18030 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
18040 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
18050 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
18060 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
18070 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
18080 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
18090 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
180a0 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
180b0 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
180c0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
180d0 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
180e0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
180f0 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
18100 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
18110 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
18120 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
18130 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
18140 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
18150 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
18160 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
18170 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
18180 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
18190 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
181a0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
181b0 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
181c0 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
181d0 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
181e0 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
181f0 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
18200 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
18210 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66  ET_ALLOC 25.#def
18220 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
18230 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65  T       25.#ifde
18240 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18250 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
18260 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20  r_n_sort_bucket 
18270 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f  = 0;.  #undef N_
18280 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64  SORT_BUCKET.  #d
18290 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
182a0 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65  KET \.   (sqlite
182b0 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
182c0 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61  ucket?sqlite3_pa
182d0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
182e0 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  t:N_SORT_BUCKET_
182f0 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74  ALLOC).#endif.st
18300 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
18310 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
18320 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
18330 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  a[N_SORT_BUCKET_
18340 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e  ALLOC], *p;.  in
18350 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c  t i;.  memset(a,
18360 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a   0, sizeof(a));.
18370 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a    while( pIn ){.
18380 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20      p = pIn;.   
18390 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79   pIn = p->pDirty
183a0 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
183b0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
183c0 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
183d0 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  T-1; i++){.     
183e0 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a   if( a[i]==0 ){.
183f0 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70          a[i] = p
18400 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18410 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18420 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f        p = merge_
18430 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
18440 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  );.        a[i] 
18450 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
18460 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f   }.    if( i==N_
18470 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b  SORT_BUCKET-1 ){
18480 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61  .      /* Covera
18490 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c  ge: To get here,
184a0 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62   there need to b
184b0 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b  e 2^(N_SORT_BUCK
184c0 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c  ET) .      ** el
184d0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
184e0 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69  put list. This i
184f0 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
18500 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20  impractical..   
18510 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68     ** Testing th
18520 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70  is line is the p
18530 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76  oint of global v
18540 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
18550 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
18560 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20  _sort_bucket..  
18570 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69      */.      a[i
18580 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  ] = merge_pageli
18590 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
185a0 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30   }.  }.  p = a[0
185b0 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
185c0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69  N_SORT_BUCKET; i
185d0 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72  ++){.    p = mer
185e0 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61  ge_pagelist(p, a
185f0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
18600 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
18610 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
18620 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
18630 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
18640 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
18650 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
18660 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
18670 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
18680 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
18690 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
186a0 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
186b0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
186c0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
186d0 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
186e0 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48 64   *pPager;.  PgHd
186f0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  r *p;.  int rc;.
18700 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18710 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
18720 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
18730 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
18740 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
18750 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
18760 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
18770 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
18780 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
18790 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
187a0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
187b0 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
187c0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
187d0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
187e0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
187f0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
18800 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
18810 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
18820 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
18830 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
18840 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
18850 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
18860 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
18870 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
18880 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
18890 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
188a0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
188b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
188c0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
188d0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
188e0 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
188f0 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
18900 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
18910 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
18920 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
18930 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
18940 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
18950 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
18960 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
18970 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
18980 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
18990 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
189a0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
189b0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
189c0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
189d0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
189e0 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
189f0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
18a00 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
18a10 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
18a20 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
18a30 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
18a40 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
18a50 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
18a60 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
18a70 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
18a80 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
18a90 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
18aa0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
18ab0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
18ac0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
18ad0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
18ae0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
18af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18b00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
18b10 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
18b20 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
18b30 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
18b40 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
18b50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
18b60 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64  irty );.    p->d
18b70 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
18b80 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
18b90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
18ba0 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
18bb0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
18bc0 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20  n it now. */.   
18bd0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
18be0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
18bf0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
18c00 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
18c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18c20 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
18c30 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
18c40 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
18c50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
18c60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18c70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
18c80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
18c90 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
18ca0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
18cb0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
18cc0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
18cd0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
18ce0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
18cf0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
18d00 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
18d10 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
18d20 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
18d30 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
18d40 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
18d50 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
18d60 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
18d70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
18d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18d90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
18da0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
18db0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
18dc0 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
18dd0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
18de0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
18df0 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
18e00 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
18e10 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
18e20 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
18e30 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
18e40 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20  RACE4("STORE %d 
18e50 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18e60 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
18e70 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
18e80 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
18e90 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
18ea0 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a  gehash(pList));.
18eb0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18ec0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
18ed0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
18ee0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
18ef0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18f00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
18f10 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18f20 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
18f30 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
18f40 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
18f50 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
18f60 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
18f70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
18f80 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
18f90 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
18fa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
18fb0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
18fc0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
18fd0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
18fe0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
18ff0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
19000 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
19010 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
19020 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
19030 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19040 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
19050 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
19060 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
19070 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69   ) return rc;.#i
19080 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
19090 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
190a0 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
190b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
190c0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
190d0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
190e0 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
190f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19100 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
19110 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
19120 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
19130 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
19140 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19150 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
19160 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
19170 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
19180 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
19190 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
191a0 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
191b0 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
191c0 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
191d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
191e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
191f0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
19200 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72  urn TRUE if ther
19210 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
19220 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  al on the given 
19230 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20  pager..** A hot 
19240 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
19250 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
19260 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  played back..**.
19270 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
19280 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
19290 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
192a0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
192b0 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
192c0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
192d0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
192e0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
192f0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
19300 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19310 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65  name.  Just dele
19320 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
19330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
19340 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
19350 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
19360 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
19370 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
19380 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
19390 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
193a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
193b0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
193c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
193d0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
193e0 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20  SS_EXISTS) ){.  
193f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19400 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
19410 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19420 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
19430 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19440 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  }.  if( sqlite3P
19450 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
19460 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
19470 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
19480 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
19490 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
194a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
194b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
194c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
194d0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
194e0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
194f0 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
19500 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
19510 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
19520 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
19530 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
19540 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
19550 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
19560 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  he pPager->errCo
19570 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  de variable..*/.
19580 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19590 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
195a0 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
195b0 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
195c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
195d0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
195e0 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b   assert(!MEMDB);
195f0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
19600 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
19610 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
19620 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
19630 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
19640 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
19650 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
19660 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
19670 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
19680 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
19690 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
196a0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
196b0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
196c0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
196d0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
196e0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
196f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
19700 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
19710 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
19720 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
19730 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
19740 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
19750 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
19760 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
19770 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
19780 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  && pPager->lru.p
19790 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
197a0 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
197b0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
197c0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
197d0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
197e0 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  >fd);.    int rc
197f0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
19800 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19810 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
19820 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19830 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19840 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
19850 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
19860 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
19870 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
19880 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
19890 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
198a0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
198b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
198c0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
198d0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
198e0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
198f0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
19900 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
19910 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
19920 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
19930 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
19940 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
19950 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
19960 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
19970 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
19980 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
19990 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
199a0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
199b0 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
199c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
199d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
199e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
199f0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
19a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19a10 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
19a20 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
19a30 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
19a40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
19a50 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
19a60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19a70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19a80 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
19a90 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20  u.pFirst;.  }.  
19aa0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
19ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ac0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
19ad0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
19ae0 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
19af0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
19b00 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
19b10 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a  it is dirty..  *
19b20 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  /.  if( pPg->dir
19b30 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ty ){.    int rc
19b40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19b50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
19b60 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
19b70 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  pPg);.    pPg->d
19b80 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
19b90 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
19ba0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
19bb0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
19bc0 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  g );.    pPg->di
19bd0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
19be0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19bf0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
19c00 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
19c10 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
19c20 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
19c30 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
19c40 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
19c50 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
19c60 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
19c70 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
19c80 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
19c90 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
19ca0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
19cb0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
19cc0 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
19cd0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
19ce0 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
19cf0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
19d00 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
19d10 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
19d20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
19d30 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
19d40 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
19d50 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
19d60 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
19d70 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
19d80 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
19d90 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
19da0 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
19db0 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
19dc0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
19dd0 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
19de0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
19df0 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
19e00 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
19e10 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
19e20 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
19e30 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
19e40 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
19e50 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
19e60 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
19e70 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
19e80 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
19e90 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
19ea0 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
19eb0 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
19ec0 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
19ed0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
19ee0 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70  pgno==0 );..  *p
19ef0 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
19f00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19f10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19f20 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
19f30 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54  NAGEMENT./*.** T
19f40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19f50 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
19f60 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
19f70 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
19f80 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
19f90 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
19fa0 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
19fb0 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
19fc0 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
19fd0 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
19fe0 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
19ff0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65   sqlite3_free()e
1a000 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
1a010 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1a020 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
1a030 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
1a040 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
1a050 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
1a060 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
1a070 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ns. The return v
1a080 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61  alue is the tota
1a090 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20  l number .** of 
1a0a0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1a0b0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74  released..*/.int
1a0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c   sqlite3PagerRel
1a0d0 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e  easeMemory(int n
1a0e0 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c  Req){.  int nRel
1a0f0 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20  eased = 0;      
1a100 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1a110 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 20  memory released 
1a120 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c 69  so far */.  sqli
1a130 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1a140 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d  ;       /* The M
1a150 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20 50  EM2 mutex */.  P
1a160 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1a170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1a180 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1a190 61 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72  agers */.  int r
1a1a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a1b0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
1a1c0 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
1a1d0 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20  nt mutex.  */.  
1a1e0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1a1f0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1a200 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1a210 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  MEM2);.  sqlite3
1a220 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
1a230 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61  ex);..  /* Signa
1a240 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  l all database c
1a250 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1a260 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  memory managemen
1a270 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20  t wants.  ** to 
1a280 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74  have access to t
1a290 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a  he pagers..  */.
1a2a0 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c    for(pPager=sql
1a2b0 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70  ite3PagerList; p
1a2c0 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50  Pager; pPager=pP
1a2d0 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
1a2e0 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73     pPager->iInUs
1a2f0 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  eMM = 1;.  }..  
1a300 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a310 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20  E_OK && (nReq<0 
1a320 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
1a330 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  q) ){.    PgHdr 
1a340 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20  *pPg;.    PgHdr 
1a350 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20  *pRecycled;. .  
1a360 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1a370 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1a380 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1a390 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28   require a sync(
1a3a0 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69  ). If.    ** thi
1a3b0 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
1a3c0 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74  e, find one that
1a3d0 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20   does require a 
1a3e0 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  sync()..    */. 
1a3f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1a400 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
1a410 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1a420 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1a430 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  RU));.    pPg = 
1a440 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1a450 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  st.pFirstSynced;
1a460 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1a470 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e  && (pPg->needSyn
1a480 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  c || pPg->pPager
1a490 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20  ->iInUseDB) ){. 
1a4a0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1a4b0 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1a4c0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20   }.    if( !pPg 
1a4d0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  ){.      pPg = s
1a4e0 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
1a4f0 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  t.pFirst;.      
1a500 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50  while( pPg && pP
1a510 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1a520 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eDB ){.        p
1a530 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e  Pg = pPg->gfree.
1a540 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1a550 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a560 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
1a570 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1a580 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1a590 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20  ATIC_LRU));..   
1a5a0 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74   /* If pPg==0, t
1a5b0 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62  hen the block ab
1a5c0 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20 74  ove has failed t
1a5d0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1a5e0 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e  .    ** recycle.
1a5f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
1a600 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20  turn early - no 
1a610 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77  further memory w
1a620 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
1a630 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leased..    */. 
1a640 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62 72     if( !pPg ) br
1a650 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  eak;..    pPager
1a660 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1a670 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67 2d      assert(!pPg-
1a680 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1a690 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1a6a0 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  irst);.    asser
1a6b0 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  t(pPg->needSync 
1a6c0 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  || pPg==pPager->
1a6d0 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1a6e0 29 3b 0a 20 20 0a 20 20 20 20 72 63 20 3d 20 70  );.  .    rc = p
1a6f0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
1a700 67 65 72 2c 20 31 2c 20 26 70 52 65 63 79 63 6c  ger, 1, &pRecycl
1a710 65 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ed);.    assert(
1a720 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c  pRecycled==pPg |
1a730 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc!=SQLITE_OK)
1a740 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a760 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
1a770 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
1a780 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1a790 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1a7a0 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65  .      ** remove
1a7b0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
1a7c0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
1a7d0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
1a7e0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  -list .      ** 
1a7f0 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
1a800 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
1a810 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
1a820 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
1a830 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
1a840 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
1a850 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
1a860 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1a870 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
1a880 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
1a890 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
1a8a0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
1a8b0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
1a8c0 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
1a8d0 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  */.      PgHdr *
1a8e0 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  pTmp;.      asse
1a8f0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
1a900 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
1a910 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1a920 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1a930 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1a940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1a950 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
1a960 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
1a970 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
1a980 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
1a990 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
1a9a0 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
1a9b0 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
1a9c0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
1a9d0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a   nReleased += (.
1a9e0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1a9f0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
1aa00 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
1aa10 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
1aa20 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1aa30 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d  ra.          + M
1aa40 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
1aa50 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b  story) .      );
1aa60 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1aa70 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
1aa80 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1aa90 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
1aaa0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1aab0 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1aac0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ount);.      sql
1aad0 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
1aae0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
1aaf0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65  age--;.    }else
1ab00 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72  {.      /* An er
1ab10 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
1ab20 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
1ab30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ab40 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  or .      ** jou
1ab50 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
1ab60 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
1ab70 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
1ab80 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
1ab90 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68   ** caller of th
1aba0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73  is function. Ins
1abb0 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61  tead, set the Pa
1abc0 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69  ger.errCode vari
1abd0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
1abe0 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
1abf0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1ac00 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
1ac10 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
1ac20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
1ac30 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
1ac40 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
1ac50 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
1ac60 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
1ac70 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1ac80 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30  .          (rc&0
1ac90 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
1aca0 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  RR ||.          
1acb0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
1acc0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ||.          rc=
1acd0 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
1ace0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1acf0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ad00 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1ad10 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  D );.      pager
1ad20 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1ad30 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1ad40 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65   /* Clear the me
1ad50 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1ad60 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73  flags and releas
1ad70 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f  e the mutex.  */
1ad80 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1ad90 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1ada0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1adb0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1adc0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1add0 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  seMM = 0;.  }.  
1ade0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1adf0 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  ave(mutex);..  /
1ae00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ae10 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c  ber of bytes rel
1ae20 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74  eased.  */.  ret
1ae30 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
1ae40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ae50 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1ae60 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
1ae70 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1ae80 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
1ae90 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1aea0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
1aeb0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1aec0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1aed0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
1aee0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
1aef0 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
1af00 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
1af10 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
1af20 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
1af30 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
1af40 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
1af50 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1af60 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
1af70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1af80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1af90 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
1afa0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1afb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1afc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1afd0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
1afe0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1aff0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1b000 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
1b010 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1b020 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1b030 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1b040 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1b050 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1b060 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1b070 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1b080 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1b090 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1b0a0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1b0b0 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
1b0c0 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
1b0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b100 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1b110 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
1b120 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1b130 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1b140 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
1b150 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
1b160 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
1b170 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1b180 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b190 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1b1a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
1b1b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1b1c0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1b1d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1b1e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1b1f0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1b200 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
1b210 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
1b220 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
1b230 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
1b240 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
1b250 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
1b260 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
1b270 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
1b280 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1b290 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
1b2a0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
1b2b0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1b2c0 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
1b2d0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1b2e0 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
1b2f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
1b300 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
1b310 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
1b320 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
1b330 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
1b340 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
1b350 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
1b360 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
1b370 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1b380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
1b390 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1b3a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1b3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1b3c0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1b3d0 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
1b3e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
1b3f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b400 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
1b410 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
1b420 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
1b430 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1b440 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1b450 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
1b460 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b480 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1b490 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1b4a0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1b4b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1b4c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b4d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1b4e0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
1b4f0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
1b500 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
1b510 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
1b520 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1b530 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
1b540 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
1b550 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
1b560 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
1b570 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
1b580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1b590 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
1b5a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1b5b0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
1b5c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1b5d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b5e0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
1b5f0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
1b600 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1b610 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
1b620 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
1b630 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
1b640 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
1b650 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
1b660 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
1b670 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
1b680 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
1b690 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1b6a0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
1b6b0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
1b6c0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
1b6d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
1b6e0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
1b6f0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
1b700 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
1b710 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
1b720 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
1b730 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
1b740 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
1b750 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
1b760 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
1b770 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
1b780 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
1b790 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
1b7a0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
1b7b0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
1b7c0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
1b7d0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
1b7e0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
1b7f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1b800 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
1b810 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
1b820 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1b830 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
1b840 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1b850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b870 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
1b880 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
1b890 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
1b8a0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1b8b0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
1b8c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1b8d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1b8e0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
1b8f0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
1b900 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
1b910 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
1b920 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
1b930 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
1b940 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
1b950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b960 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
1b970 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
1b980 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
1b990 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
1b9a0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
1b9b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
1b9c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
1b9d0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
1b9e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1b9f0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
1ba00 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
1ba10 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
1ba20 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
1ba30 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
1ba40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
1ba50 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
1ba60 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
1ba70 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
1ba80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1ba90 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
1baa0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
1bab0 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
1bac0 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
1bad0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
1bae0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1baf0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1bb00 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
1bb10 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
1bb20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
1bb30 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
1bb40 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
1bb50 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
1bb60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
1bb70 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
1bb80 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
1bb90 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
1bba0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
1bbb0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
1bbc0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
1bbd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1bbe0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bbf0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
1bc00 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  ( sqlite3OsAcces
1bc10 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
1bc20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1bc30 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
1bc40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1bc50 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
1bc60 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1bc70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1bc80 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1bc90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
1bca0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1bcb0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1bcc0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
1bcd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1bce0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1bcf0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1bd00 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1bd10 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
1bd20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1bd30 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1bd40 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
1bd50 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  s );.          i
1bd60 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  f( fout&SQLITE_O
1bd70 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1bd90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1bda0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bdb0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
1bdc0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
1bdd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1bde0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bdf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1be00 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1be10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1be20 20 20 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d      return (rc==
1be30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3f 72 63 3a  SQLITE_NOMEM?rc:
1be40 53 51 4c 49 54 45 5f 42 55 53 59 29 3b 0a 20 20  SQLITE_BUSY);.  
1be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1be70 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
1be80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1be90 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
1bea0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1beb0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
1bec0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
1bed0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
1bee0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1bef0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
1bf00 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
1bf10 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
1bf20 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
1bf30 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
1bf40 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
1bf50 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
1bf60 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1bf70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bf80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bf90 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
1bfa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bfb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bfc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1bfd0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1bfe0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1bff0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1c000 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
1c010 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
1c020 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
1c030 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1c040 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1c050 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
1c060 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
1c070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1c080 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
1c090 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1c0a0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
1c0b0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
1c0c0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
1c0d0 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
1c0e0 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
1c0f0 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
1c100 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
1c110 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
1c120 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f         ** read o
1c130 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1c140 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
1c150 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
1c160 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  ase.        ** h
1c170 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1c180 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1c190 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
1c1a0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
1c1b0 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
1c1c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1c1d0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
1c1e0 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
1c1f0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
1c200 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
1c210 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66          ** at of
1c220 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
1c230 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
1c240 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
1c250 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
1c260 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
1c270 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
1c280 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
1c290 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
1c2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  .        ** othe
1c2b0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
1c2c0 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
1c2d0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
1c2e0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  en.        ** a 
1c2f0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
1c300 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
1c310 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
1c320 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
1c330 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
1c340 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
1c350 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a  ot be .        *
1c360 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
1c370 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
1c380 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
1c390 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
1c3a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63  .        ** it c
1c3b0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
1c3c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1c3d0 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
1c3e0 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
1c3f0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
1c400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c410 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1c420 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
1c430 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1c440 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
1c450 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1c460 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
1c470 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1c480 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1c490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49  0 ){.          I
1c4a0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
1c4b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1c4c0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1c4d0 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
1c4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c4f0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1c500 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
1c510 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1c520 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
1c530 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c540 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1c550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c580 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
1c590 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
1c5a0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1c5b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c5c0 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
1c5d0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1c5e0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1c5f0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
1c600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1c610 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1c620 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1c630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1c640 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c650 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1c660 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
1c670 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1c680 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c690 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1c6a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1c6b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1c6c0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
1c6d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1c6e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
1c6f0 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a  cate a PgHdr obj
1c700 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72  ect.   Either cr
1c710 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f  eate a new one o
1c720 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78  r reuse.** an ex
1c730 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20  isting one that 
1c740 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
1c750 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   in use..**.** A
1c760 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63   new PgHdr struc
1c770 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
1c780 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
1c790 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74  llowing are.** t
1c7a0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1c7b0 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20  1)  We have not 
1c7c0 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78  exceeded our max
1c7d0 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63  imum allocated c
1c7e0 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20  ache size.**    
1c7f0 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20        as set by 
1c800 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68  the "PRAGMA cach
1c810 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e  e_size" command.
1c820 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
1c830 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75  There are no unu
1c840 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74  sed PgHdr object
1c850 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
1c860 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  his time..**.** 
1c870 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73      (3)  This is
1c880 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1c890 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
1c8a0 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65    (4)  There are
1c8b0 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74   no PgHdr object
1c8c0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  s that do not re
1c8d0 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a  quire a journal.
1c8e0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  **          file
1c8f0 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63   sync and a sync
1c900 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c910 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
1c920 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72  y.**          pr
1c930 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ohibited..**.** 
1c940 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65  Otherwise, reuse
1c950 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48   an existing PgH
1c960 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  dr.  In other wo
1c970 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a  rds, reuse an.**
1c980 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20   existing PgHdr 
1c990 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1c9a0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1c9b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
1c9c0 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64   We have reached
1c9d0 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65   or exceeded the
1c9e0 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73   maximum cache s
1c9f0 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1ca00 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47  allowed by "PRAG
1ca10 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a  MA cache_size"..
1ca20 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
1ca30 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20  here is a PgHdr 
1ca40 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50  available with P
1ca50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a  gHdr->nRef==0.**
1ca60 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20  .**     (3)  We 
1ca70 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e  are not in an in
1ca80 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1ca90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
1caa0 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20  Either there is 
1cab0 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48  an available PgH
1cac0 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  dr that does not
1cad0 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20   need.**        
1cae0 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74    to be synced t
1caf0 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64  o disk or else d
1cb00 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63  isk syncing is c
1cb10 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
1cb20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f       allowed..*/
1cb30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1cb40 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61  rAllocatePage(Pa
1cb50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1cb60 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e  dr **ppPg){.  in
1cb70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1cb80 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1cb90 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  .  /* Create a n
1cba0 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20  ew PgHdr if any 
1cbb0 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64  of the four cond
1cbc0 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a  itions defined .
1cbd0 20 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d    ** above are m
1cbe0 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  et: */.  if( pPa
1cbf0 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
1cc00 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20  r->mxPage.   || 
1cc10 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1cc20 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d  st==0 .   || MEM
1cc30 44 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72  DB.   || (pPager
1cc40 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1cc50 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
1cc60 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b  >doNotSync).  ){
1cc70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1cc80 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e  >nPage>=pPager->
1cc90 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70  nHash ){.      p
1cca0 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
1ccb0 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20  _table(pPager,. 
1ccc0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ccd0 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
1cce0 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
1ccf0 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  2);.      if( pP
1cd00 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
1cd10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1cd20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1cd30 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1cd40 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1cd50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1cd60 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1cd70 72 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  r);.    pPg = sq
1cd80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
1cd90 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
1cda0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->pageSize.  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1cdd0 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
1cde0 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1ce10 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
1ce20 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72  ;.    pagerEnter
1ce30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1ce40 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
1ce50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1ce60 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1ce70 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1ce80 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
1ce90 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
1cea0 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
1ceb0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1cec0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
1ced0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1cee0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
1cef0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
1cf00 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
1cf10 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
1cf20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
1cf30 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
1cf40 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1cf50 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65  = pPg;.    pPage
1cf60 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65  r->nPage++;.  }e
1cf70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79  lse{.    /* Recy
1cf80 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  cle an existing 
1cf90 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f  page with a zero
1cfa0 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20   ref-count. */. 
1cfb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
1cfc0 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c  cycle(pPager, 1,
1cfd0 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
1cfe0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
1cff0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d000 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
1d010 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ED;.    }.    if
1d020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d030 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
1d040 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1d050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1d060 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1d070 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
1d080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67  ;.    assert(pPg
1d090 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d  );.  }.  *ppPg =
1d0a0 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c   pPg;..pager_all
1d0b0 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74  ocate_out:.  ret
1d0c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d0d0 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
1d0e0 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ve the content f
1d0f0 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74  or a page.  If t
1d100 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70  he page was.** p
1d110 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
1d120 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
1d130 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  t==1, then the c
1d140 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75  ontent was.** ju
1d150 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  st initialized t
1d160 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20  o zeros instead 
1d170 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  of being read fr
1d180 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20  om disk..** But 
1d190 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65 20  now we need the 
1d1a0 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66  real data off of
1d1b0 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20   disk.  So make 
1d1c0 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20  sure we.** have 
1d1d0 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20  it.  Read it in 
1d1e0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  if we do not hav
1d1f0 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f  e it already..*/
1d200 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d210 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67  r_get_content(Pg
1d220 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
1d230 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 29   pPg->needRead )
1d240 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72  {.    int rc = r
1d250 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70  eadDbPage(pPg->p
1d260 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d  Pager, pPg, pPg-
1d270 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
1d280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d290 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1d2a0 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Read = 0;.    }e
1d2b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1d2c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1d2d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d2e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
1d2f0 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
1d300 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
1d310 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
1d320 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
1d330 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1d340 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
1d350 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
1d360 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
1d370 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
1d380 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
1d390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
1d3a0 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
1d3b0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
1d3c0 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
1d3d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1d3e0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1d3f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
1d400 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
1d410 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
1d420 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
1d430 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
1d440 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
1d450 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
1d460 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
1d470 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
1d480 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
1d490 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
1d4a0 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
1d4b0 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
1d4c0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
1d4d0 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
1d4e0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
1d4f0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
1d500 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
1d510 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
1d520 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
1d530 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1d540 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
1d550 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
1d560 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
1d570 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
1d580 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
1d590 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
1d5a0 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
1d5b0 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
1d5c0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
1d5d0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
1d5e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
1d5f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
1d600 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
1d610 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
1d620 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
1d630 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
1d640 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
1d650 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
1d660 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
1d670 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
1d680 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
1d690 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
1d6a0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
1d6b0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
1d6c0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
1d6d0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
1d6e0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
1d6f0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
1d700 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
1d710 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
1d720 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
1d730 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  s..**.** If noCo
1d740 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ntent is false, 
1d750 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d760 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72  s are actually r
1d770 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
1d780 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
1d790 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
1d7a0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
1d7b0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
1d7c0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
1d7d0 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
1d7e0 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64  ime, so do not d
1d7f0 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20  o a disk read.  
1d800 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
1d810 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  .** page content
1d820 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75   with zeros.  Bu
1d830 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20  t mark the fact 
1d840 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74  that we have not
1d850 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e   read the.** con
1d860 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20  tent by setting 
1d870 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
1d880 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20  ad flag.  Later 
1d890 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74  on, if .** sqlit
1d8a0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1d8b0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  s called on this
1d8c0 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69 73   page or if this
1d8d0 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63   routine is.** c
1d8e0 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68  alled again with
1d8f0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74   noContent==0, t
1d900 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
1d910 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65  he content is ne
1d920 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eded.** and the 
1d930 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64  disk read should
1d940 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
1d950 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
1d960 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65  int pagerAcquire
1d970 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1d980 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
1d990 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
1d9a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1d9b0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
1d9c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
1d9d0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
1d9e0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
1d9f0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
1da00 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1da10 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
1da20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
1da30 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1da40 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
1da50 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
1da60 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1da70 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
1da80 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1da90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1daa0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
1dab0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20   pPager->nRef>0 
1dac0 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20  || pgno==1 );.. 
1dad0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
1dae0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
1daf0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
1db00 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
1db10 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
1db20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1db30 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
1db40 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
1db50 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
1db60 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
1db70 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
1db80 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1db90 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
1dba0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1dbb0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1dbc0 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
1dbd0 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
1dbe0 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
1dbf0 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
1dc00 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
1dc10 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
1dc20 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1dc30 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1dc40 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1dc50 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
1dc60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1dc70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1dc80 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1dc90 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
1dca0 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
1dcb0 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
1dcc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1dcd0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1dce0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  () is a no-op if
1dcf0 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73   .  ** a databas
1dd00 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  e lock is alread
1dd10 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72  y held..  */.  r
1dd20 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c  c = pagerSharedL
1dd30 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
1dd40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dd50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1dd60 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1dd70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1dd80 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1dd90 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1dda0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1ddb0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
1ddc0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
1ddd0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1dde0 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
1ddf0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
1de00 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e  int nMax;.    in
1de10 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  t h;.    PAGER_I
1de20 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
1de30 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  s);.    rc = pag
1de40 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  erAllocatePage(p
1de50 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
1de60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1de70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1de80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1de90 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
1dea0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
1deb0 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e   !MEMDB || pgno>
1dec0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ded0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1dee0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
1def0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
1df00 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1df10 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73  ){.#if 0.      s
1df20 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
1df30 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
1df40 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 23  rnal, pgno/8);.#
1df50 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73 73 65  endif.      asse
1df60 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1df70 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
1df80 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1df90 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
1dfa0 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
1dfb0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
1dfc0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
1dfd0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1dfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
1dff0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1e000 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1e010 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
1e020 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
1e030 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
1e040 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
1e050 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70  NFO(pPg);..    p
1e060 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
1e070 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1e080 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
1e090 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
1e0a0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
1e0b0 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
1e0c0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
1e0d0 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65     nMax = sqlite
1e0e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1e0f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1e100 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1e110 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e120 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1e130 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
1e140 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1e150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e160 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
1e170 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
1e180 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
1e190 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
1e1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1e1b0 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
1e1c0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
1e1d0 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
1e1e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e1f0 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
1e200 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43  || MEMDB || (noC
1e210 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
1e220 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1e230 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  k) ){.      if( 
1e240 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
1e250 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
1e260 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e270 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1e280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1e290 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
1e2a0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
1e2b0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
1e2c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1e2d0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e2e0 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e  dRead = noConten
1e2f0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c  t && !pPager->al
1e300 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  waysRollback;.  
1e310 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
1e320 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
1e330 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1e340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1e350 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1e360 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29  ager, pPg, pgno)
1e370 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e380 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1e390 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1e3a0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1e3b0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
1e3c0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
1e3d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1e3e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e3f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e400 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
1e410 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
1e420 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61    /* Link the pa
1e430 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
1e440 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
1e450 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70     h = pgno & (p
1e460 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
1e470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
1e480 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  o!=0 );.    pPg-
1e490 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
1e4a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
1e4b0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
1e4c0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
1e4d0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
1e4e0 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1e4f0 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
1e500 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
1e510 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
1e520 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
1e530 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
1e540 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1e550 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1e560 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1e570 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1e580 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
1e590 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
1e5a0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
1e5b0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1e5c0 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
1e5d0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  t(pPager->nRef>0
1e5e0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20   || pgno==1);.  
1e5f0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1e600 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
1e610 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29  if( !noContent )
1e620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1e630 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
1e640 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1e650 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
1e660 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e670 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 72      }.    page_r
1e680 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
1e690 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
1e6a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e6b0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ;.}.int sqlite3P
1e6c0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1e6d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1e6e0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1e6f0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1e700 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1e710 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1e720 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1e730 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1e740 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1e750 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1e760 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1e770 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1e780 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1e790 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1e7a0 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1e7b0 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1e7c0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
1e7d0 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
1e7e0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
1e7f0 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70 50   pagerAcquire(pP
1e800 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
1e810 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
1e820 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1e830 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1e840 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  c;.}.../*.** Acq
1e850 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
1e860 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
1e870 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1e880 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
1e890 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
1e8a0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
1e8b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e8c0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
1e8d0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1e8e0 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
1e8f0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
1e900 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
1e910 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1e920 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1e930 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
1e940 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
1e950 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
1e960 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
1e970 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
1e980 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
1e990 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1e9a0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
1e9b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1e9c0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1e9d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1e9e0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
1e9f0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
1ea00 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
1ea10 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
1ea20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1ea30 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1ea40 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1ea50 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
1ea60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ea70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1ea80 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1ea90 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1eaa0 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
1eab0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1eac0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  NLOCK ){.    ass
1ead0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41  ert( !pPager->pA
1eae0 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  ll || pPager->ex
1eaf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
1eb00 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1eb10 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1eb20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1eb30 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1eb40 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
1eb50 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  */.  }else if( (
1eb60 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1eb70 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1eb80 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  )!=0 ){.    page
1eb90 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
1eba0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1ebb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  er);.  return pP
1ebc0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
1ebd0 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
1ebe0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
1ebf0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1ec00 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
1ec10 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
1ec20 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
1ec30 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
1ec40 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
1ec50 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
1ec60 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
1ec70 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
1ec80 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
1ec90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1eca0 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
1ecb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ecc0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
1ecd0 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a  age *pPg){..  /*
1ece0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
1ecf0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1ed00 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
1ed10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
1ed20 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
1ed30 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
1ed40 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
1ed50 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
1ed60 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
1ed70 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
1ed80 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
1ed90 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1eda0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
1edb0 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
1edc0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
1edd0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
1ede0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
1edf0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
1ee00 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
1ee10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1ee20 50 61 67 65 72 3b 0a 0a 20 20 20 20 6c 72 75 4c  Pager;..    lruL
1ee30 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20  istAdd(pPg);.   
1ee40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
1ee50 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
1ee60 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
1ee70 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
1ee80 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1ee90 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
1eea0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
1eeb0 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
1eec0 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
1eed0 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
1eee0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eef0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
1ef00 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
1ef10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ef20 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
1ef30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
1ef40 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
1ef50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1ef60 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1ef70 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
1ef80 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
1ef90 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1efa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
1efb0 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50  gerLeave(pPg->pP
1efc0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1efd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1efe0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
1eff0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
1f000 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
1f010 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
1f020 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
1f030 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1f040 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f050 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
1f060 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1f070 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f080 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1f090 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
1f0a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
1f0b0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
1f0c0 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
1f0d0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1f0e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1f0f0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1f100 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1f110 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
1f120 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1f130 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c  ->pVfs;.  int fl
1f140 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
1f150 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1f160 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1f170 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  VE|SQLITE_OPEN_C
1f180 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72  REATE);..  int r
1f190 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
1f1a0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1f1b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1f1c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1f1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f1e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1f1f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f200 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1f210 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1f220 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1f230 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1f240 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1f250 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
1f260 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1f270 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1f280 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  rnal = sqlite3Ma
1f290 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72  llocZero( pPager
1f2a0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1f2b0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
1f2c0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
1f2d0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1f2e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1f2f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f300 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1f310 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1f320 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1f330 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
1f340 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1f350 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1f360 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
1f370 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
1f380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c  .  }else{.    fl
1f390 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
1f3a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1f3b0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
1f3c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1f3d0 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d 20  IC_WRITE.  rc = 
1f3e0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
1f3f0 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c 20  en(.      pVfs, 
1f400 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f410 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1f420 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
1f430 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 29  Size(pPager).  )
1f440 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73  ;.#else.  rc = s
1f450 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1f460 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1f470 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1f480 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
1f490 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72 63  dif.  assert( rc
1f4a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1f4b0 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1f4c0 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65 72  hods );.  pPager
1f4d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1f4e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
1f4f0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
1f500 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1f510 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1f520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1f540 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
1f550 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
1f560 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1f570 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rnal, 0);.    }.
1f580 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1f590 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1f5a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1f5b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
1f5c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f5d0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1f5e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1f5f0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1f600 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1f610 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
1f620 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
1f630 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1f640 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
1f650 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
1f660 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1f670 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1f680 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1f690 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1f6a0 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
1f6b0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1f6c0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
1f6d0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1f6e0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
1f6f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1f700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
1f710 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
1f720 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1f730 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1f740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
1f750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1f760 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1f770 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1f780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f790 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f7a0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1f7b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
1f7c0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1f7d0 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
1f7e0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
1f7f0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
1f800 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1f810 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1f820 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
1f830 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
1f840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f850 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
1f860 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
1f870 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
1f880 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
1f890 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
1f8a0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f8b0 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
1f8c0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1f8d0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1f8e0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1f8f0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1f900 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
1f910 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1f920 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1f930 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
1f940 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
1f950 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
1f960 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
1f970 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
1f980 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1f990 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
1f9a0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1f9b0 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
1f9c0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
1f9d0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
1f9e0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
1f9f0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
1fa00 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1fa10 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1fa20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1fa30 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1fa40 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1fa50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1fa60 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1fa70 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1fa80 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1fa90 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1faa0 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1fab0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1fac0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1fad0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1fae0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1faf0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1fb00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1fb10 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1fb20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1fb30 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1fb40 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1fb50 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1fb60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1fb70 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1fb80 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1fb90 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1fba0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1fbb0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1fbc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fbd0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1fbe0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1fbf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1fc00 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1fc10 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1fc20 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1fc30 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1fc40 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1fc50 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1fc60 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1fc70 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1fc80 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1fc90 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1fca0 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1fcb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fcc0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1fcd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1fce0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1fcf0 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1fd00 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1fd10 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1fd20 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1fd30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72  LITE_OK;.  pager
1fd40 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1fd50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1fd60 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
1fd70 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1fd80 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1fd90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1fda0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1fdb0 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
1fdc0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1fdd0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
1fde0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1fdf0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1fe00 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1fe10 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
1fe20 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1fe30 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1fe40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fe50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1fe60 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1fe70 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1fe80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fe90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fea0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1feb0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1fec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
1fed0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
1fee0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1fef0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1ff00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1ff10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ff20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1ff30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ff40 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76         pagerLeav
1ff50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1ff60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ff70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1ff80 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1ff90 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54   0;.      PAGERT
1ffa0 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
1ffb0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
1ffc0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1ffd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
1ffe0 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
1fff0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
20000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
20010 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
20020 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20030 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
20040 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20050 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
20060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
20070 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
20080 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
20090 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
200a0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
200b0 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  ode last.    ** 
200c0 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
200d0 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
200e0 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
200f0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
20100 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
20110 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
20120 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
20130 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
20140 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
20150 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63  t open and trunc
20160 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e  ated to 0 bytes.
20170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
20180 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
20190 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
201a0 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
201b0 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  bSize==0 );.    
201c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
201d0 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
201e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
201f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
20200 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  r);.    pagerLea
20210 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
20220 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
20230 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
20240 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e  ocZero( pPager->
20250 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
20260 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
20270 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20280 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
20290 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
202a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
202b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
202c0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
202d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
202e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
202f0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
20300 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
20310 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
20320 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
20330 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
20340 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
20350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
20360 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
20370 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
20380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
20390 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
203a0 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
203b0 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
203c0 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
203d0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
203e0 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
203f0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
20400 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
20410 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
20420 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20430 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
20440 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
20450 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
20460 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
20470 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
20480 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
20490 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
204a0 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
204b0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
204c0 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
204d0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
204e0 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
204f0 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
20500 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
20510 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
20520 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
20530 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
20540 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
20550 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
20560 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
20570 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
20580 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
20590 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
205a0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
205b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
205c0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
205d0 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
205e0 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  pPg->pDirty->pPr
205f0 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  evDirty = pPg->p
20600 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d  PrevDirty;.    }
20610 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
20620 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20  revDirty ){.    
20630 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
20640 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
20650 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
20660 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
20670 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
20680 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
20690 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
206a0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
206b0 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
206c0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
206d0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
206e0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
206f0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
20700 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
20710 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
20720 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
20730 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
20740 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
20750 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
20760 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
20770 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
20780 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
20790 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
207a0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
207b0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
207c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
207d0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
207e0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
207f0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
20800 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
20810 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
20820 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
20830 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
20840 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
20850 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20860 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
20870 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
20880 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
20890 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
208a0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
208b0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
208c0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
208d0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
208e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
208f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
20900 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
20910 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
20920 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
20930 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
20940 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
20950 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20960 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
20970 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
20980 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
20990 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
209a0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
209b0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
209c0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
209d0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
209e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
209f0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
20a00 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20a10 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
20a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20a30 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
20a40 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
20a50 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
20a60 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
20a70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
20a80 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
20a90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
20aa0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
20ab0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
20ac0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20ad0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
20ae0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
20af0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
20b00 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
20b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b20 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
20b30 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
20b40 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
20b50 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
20b60 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
20b70 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
20b80 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
20b90 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
20ba0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
20bb0 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
20bc0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
20bd0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
20be0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
20bf0 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
20c00 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
20c10 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
20c20 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
20c30 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
20c40 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
20c50 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
20c60 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
20c70 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
20c80 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
20c90 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
20ca0 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
20cb0 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
20cc0 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
20cd0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
20ce0 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
20cf0 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
20d00 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
20d10 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
20d20 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
20d30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
20d50 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
20d60 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
20d70 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
20d80 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
20d90 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
20da0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
20db0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
20dc0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
20dd0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
20de0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
20df0 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
20e00 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
20e10 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
20e20 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
20e30 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
20e40 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
20e50 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
20e60 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
20e70 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
20e80 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
20e90 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
20ea0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
20eb0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
20ec0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
20ed0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
20ee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
20ef0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
20f00 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
20f10 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
20f20 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
20f30 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
20f40 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
20f50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20f60 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
20f70 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
20f80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20f90 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
20fa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20fb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20fc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20fd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20fe0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20ff0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
21000 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
21010 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
21020 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
21030 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21040 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
21050 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
21060 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21070 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21080 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21090 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
210a0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
210b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
210c0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
210d0 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
210e0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
210f0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
21100 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
21110 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
21120 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
21130 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
21140 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
21150 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
21160 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
21170 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
21180 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
21190 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
211a0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
211b0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
211c0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
211d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
211e0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
211f0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
21200 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
21210 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
21220 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
21230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
21240 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
21250 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
21260 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21270 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
21280 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
21290 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
212a0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
212b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
212c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
212d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
212e0 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
212f0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
21300 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33  >pOrig = sqlite3
21310 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
21320 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
21330 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
21340 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
21350 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
21360 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
21370 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
21380 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
213a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
213b0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
213c0 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  m, saved;.      
213d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
213e0 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20 20  , *pEnd;..      
213f0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
21400 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
21410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21420 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
21430 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
21440 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
21450 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
21460 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
21470 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
21480 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
21490 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
214a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
214b0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
214c0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
214d0 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
214e0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
214f0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
21500 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
21510 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
21520 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
21530 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
21540 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
21550 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
21560 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
21570 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
21580 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
21590 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
215a0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
215b0 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
215c0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
215d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
215e0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
215f0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
21600 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
21610 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21620 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
21630 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
21640 50 67 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Pg, pPager->jour
21650 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  nalOff);.       
21660 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
21670 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
21680 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
21690 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
216a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
216b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a  ->journalOff, sz
216c0 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
216d0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
216e0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
216f0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
21700 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21710 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
21720 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
21730 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
21740 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
21750 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
21760 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21770 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
21780 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
21790 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67  g->needSync, pag
217a0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
217b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
217c0 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64  32*)pEnd = saved
217d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
217e0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
217f0 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
21800 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21810 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
21820 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
21830 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
21840 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
21850 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
21860 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
21870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21890 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
218a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
218b0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
218c0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
218d0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
218e0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
218f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
21900 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
21910 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
21920 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
21930 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
21940 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
21950 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
21960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
21970 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
21980 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
21990 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
219a0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
219b0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
219c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
219d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
219e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
219f0 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
21a00 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
21a10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
21a20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
21a30 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
21a40 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
21a50 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
21a60 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
21a70 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
21a80 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
21a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21aa0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
21ab0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
21ac0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
21ad0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
21ae0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
21af0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
21b00 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
21b10 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
21b20 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
21b30 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
21b40 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
21b50 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
21b60 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
21b70 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
21b80 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
21b90 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
21ba0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
21bb0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
21bc0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
21bd0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
21be0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
21bf0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
21c00 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
21c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
21c20 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
21c30 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61     && !pageInSta
21c40 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20  tement(pPg) .   
21c50 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70    && (int)pPg->p
21c60 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
21c70 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  tSize .    ){.  
21c80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
21c90 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
21ca0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
21cb0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
21cc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
21cd0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
21ce0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
21cf0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
21d00 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
21d10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
21d20 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  st->pStmt==0 );.
21d30 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
21d40 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Stmt = sqlite3_m
21d50 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70  alloc( pPager->p
21d60 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
21d70 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
21d80 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
21d90 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
21da0 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
21db0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
21dc0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
21de0 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
21df0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
21e00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21e10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
21e20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  no);.        pag
21e30 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
21e40 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
21e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
21e60 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
21e70 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70  r->stmtNRec*(4+p
21e80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21e90 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
21ea0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
21eb0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
21ec0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
21ed0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
21ee0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
21ef0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
21f00 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
21f10 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
21f20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
21f30 70 61 67 65 53 69 7a 65 2b 34 2c 20 6f 66 66 73  pageSize+4, offs
21f40 65 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  et);.        PAG
21f50 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
21f60 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
21f70 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21f80 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
21f90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21fa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21fb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21fc0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
21fd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
21fe0 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
21ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22000 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
22010 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22020 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
22030 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
22040 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
22050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22060 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
22070 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
22080 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
22090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
220a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
220b0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
220c0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
220d0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
220e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
220f0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
22100 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
22110 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
22120 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
22130 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
22140 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
22150 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
22160 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22180 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22190 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
221a0 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
221b0 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
221c0 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
221d0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
221e0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
221f0 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
22200 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
22210 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
22220 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
22230 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
22240 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
22250 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
22260 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
22270 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
22280 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
22290 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
222a0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
222b0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
222c0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
222d0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
222e0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
222f0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
22300 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
22310 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
22320 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
22330 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
22340 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22350 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
22360 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
22370 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
22380 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
22390 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
223a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
223b0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
223c0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
223d0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
223e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
223f0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
22400 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d  Pager);.  if( !M
22410 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
22420 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
22430 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
22440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
22450 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
22460 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
22470 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
22480 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
22490 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
224a0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
224b0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
224c0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
224d0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
224e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
224f0 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
22500 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
22510 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
22520 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
22530 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
22540 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
22550 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
22560 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
22570 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
22580 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
22590 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
225a0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
225b0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
225c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
225d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
225e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
225f0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
22600 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
22610 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
22620 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
22630 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
22640 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
22650 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
22660 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
22670 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
22680 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
22690 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
226a0 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
226b0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
226c0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
226d0 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
226e0 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
226f0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
22700 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
22710 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50  1)) + 1;..    nP
22720 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74  ageCount = sqlit
22730 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
22740 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
22750 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
22760 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
22770 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
22780 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
22790 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
227a0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
227b0 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
227c0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
227d0 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
227e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
227f0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
22800 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
22810 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
22820 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
22830 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
22840 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
22850 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
22860 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
22870 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
22880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
22890 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
228a0 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
228b0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
228c0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
228d0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
228e0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
228f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
22900 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
22910 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
22920 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
22930 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
22940 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
22950 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
22960 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
22970 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22980 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
22990 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
229a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
229b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
229c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
229d0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
229e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
229f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
22a00 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
22a10 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
22a20 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
22a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22a50 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
22a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22a70 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
22a80 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
22a90 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
22aa0 70 67 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pg)) ){.        
22ab0 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  if( pPage->needS
22ac0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
22ad0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
22ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
22b00 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
22b10 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
22b20 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
22b30 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
22b40 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
22b50 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
22b60 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
22b70 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
22b80 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
22b90 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
22ba0 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
22bb0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
22bc0 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
22bd0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
22be0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
22bf0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
22c00 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
22c10 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
22c20 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
22c30 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
22c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
22c50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
22c60 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
22c70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
22c80 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
22c90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
22ca0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
22cb0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
22cc0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
22cd0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20      if( pPage ) 
22ce0 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
22cf0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
22d00 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
22d10 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
22d20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
22d30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
22d40 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
22d50 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
22d60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22d70 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
22d80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
22d90 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
22da0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
22db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22dc0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
22dd0 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
22de0 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
22df0 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
22e00 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
22e10 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
22e20 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
22e30 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
22e40 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
22e50 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
22e60 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
22e70 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
22e80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22e90 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
22ea0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
22eb0 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
22ec0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
22ed0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
22ee0 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
22ef0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
22f00 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
22f10 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
22f20 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
22f30 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
22f40 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72  sqlite3PagerOver
22f50 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
22f60 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
22f70 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
22f80 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
22f90 74 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e  t rc;..  pagerEn
22fa0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
22fb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22fc0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
22fd0 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
22fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23000 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
23010 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23030 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61  memcpy(sqlite3Pa
23040 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c  gerGetData(pPg),
23050 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
23060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
23070 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
23080 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  rUnref(pPg);.  }
23090 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
230a0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
230b0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
230c0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
230d0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
230e0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
230f0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
23100 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
23110 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
23120 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
23130 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
23140 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
23150 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
23160 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
23170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
23180 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
23190 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
231a0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
231b0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
231c0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
231d0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
231e0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
231f0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
23200 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
23210 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
23220 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
23230 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
23240 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
23250 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
23260 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
23270 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
23280 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
23290 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
232a0 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
232b0 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
232c0 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
232d0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
232e0 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
232f0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
23300 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
23310 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
23320 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
23330 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
23340 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
23350 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
23360 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
23370 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
23380 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
23390 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
233a0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
233b0 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
233c0 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
233d0 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
233e0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
233f0 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
23400 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
23410 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
23420 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
23430 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
23440 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
23450 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
23460 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
23470 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
23480 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
23490 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
234a0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
234b0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
234c0 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
234d0 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
234e0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
234f0 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  Rollback() routi
23500 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
23510 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ut because the.*
23520 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
23530 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
23540 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
23550 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a  be sure it gets.
23560 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ** rolled back i
23570 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73  n spite of the s
23580 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
23590 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
235a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
235b0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62  agerDontWrite(Db
235c0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
235d0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
235e0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
235f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
23600 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45  Pager;..  if( ME
23610 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
23620 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
23630 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  r);.  pPg->alway
23640 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
23650 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
23660 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
23670 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
23680 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
23690 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
236a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
236b0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
236c0 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
236d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
236e0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
236f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
23700 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
23710 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
23720 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
23730 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
23740 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
23750 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
23760 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
23770 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
23780 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
23790 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
237a0 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
237b0 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
237c0 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
237d0 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
237e0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
237f0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
23800 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
23810 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
23820 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
23830 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
23840 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
23850 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
23860 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
23870 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
23880 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
23890 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
238a0 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
238b0 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
238c0 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
238d0 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
238e0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
238f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
23900 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
23910 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
23920 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
23930 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
23940 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
23950 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
23960 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
23970 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d  ->pgno)).      m
23980 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23  akeClean(pPg);.#
23990 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
239a0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
239b0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
239c0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
239d0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
239e0 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
239f0 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  e(pPager);.}../*
23a00 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
23a10 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
23a20 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
23a30 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
23a40 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
23a50 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
23a60 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
23a70 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
23a80 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
23a90 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
23aa0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
23ab0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
23ac0 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
23ad0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
23ae0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nal..**.** If we
23af0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63   have not yet ac
23b00 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20  tually read the 
23b10 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
23b20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20  page (if.** the 
23b30 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
23b40 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e  lag is set) then
23b50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   this routine ac
23b60 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a  ts as a promise.
23b70 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
23b80 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65  never need to re
23b90 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ad the page cont
23ba0 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  ent in the futur
23bb0 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65  e..** so the nee
23bc0 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62  dRead flag can b
23bd0 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69  e cleared at thi
23be0 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  s point..*/.void
23bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
23c00 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
23c10 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
23c20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
23c30 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45  Pager;..  pagerE
23c40 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
23c50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23c60 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
23c70 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70  ERVED );.  if( p
23c80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
23c90 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
23ca0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
23cb0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
23cc0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
23cd0 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
23ce0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
23cf0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
23d00 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
23d10 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
23d20 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
23d30 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
23d40 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
23d50 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
23d60 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
23d70 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
23d80 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
23d90 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
23da0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
23db0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
23dc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
23dd0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
23de0 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
23df0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
23e00 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a  >pgno&7);.    }.
23e10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
23e20 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
23e30 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
23e40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
23e50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
23e60 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42    IOTRACE(("GARB
23e70 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  AGE %p %d\n", pP
23e80 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
23e90 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ).  }.  if( pPag
23ea0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20  er->stmtInUse . 
23eb0 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74    && !pageInStat
23ec0 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26  ement(pPg) .   &
23ed0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
23ee0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
23ef0 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ze .  ){.    ass
23f00 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
23f10 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
23f20 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
23f30 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
23f40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23f50 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
23f60 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
23f70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
23f80 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
23f90 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  7);.  }.  pagerL
23fa0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
23fb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
23fc0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
23fd0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
23fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
23ff0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
24000 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
24010 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
24020 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
24030 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
24040 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
24050 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24060 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
24070 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
24080 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
24090 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
240a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
240b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
240c0 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f  untDone ){.    /
240d0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
240e0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
240f0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
24100 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
24110 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
24120 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
24130 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24140 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
24150 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b  if( !isDirect ){
24160 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24170 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
24180 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  gHdr);.      if(
24190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
241a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
241b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
241c0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
241d0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
241e0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
241f0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
24200 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
24210 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
24220 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
24230 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e  eVers);.    chan
24240 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
24250 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
24260 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
24270 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63  A(pPgHdr))+24, c
24280 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
24290 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
242a0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
242b0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
242c0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
242d0 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  Buf = PGHDR_TO_D
242e0 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ATA(pPgHdr);.   
242f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24300 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
24310 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
24320 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
24330 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
24340 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
24350 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
24360 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
24370 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
24380 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
24390 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
243a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
243b0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
243c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
243d0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
243e0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
243f0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
24400 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
24410 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
24420 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
24430 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
24440 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
24450 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
24460 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
24470 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
24480 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
24490 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
244a0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
244b0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
244c0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
244d0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
244e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
244f0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
24500 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
24510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24520 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
24530 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
24540 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
24550 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
24560 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
24570 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
24580 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
24590 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
245a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
245b0 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
245c0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
245d0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
245e0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
245f0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
24600 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
24610 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
24620 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
24630 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
24640 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
24650 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
24660 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
24670 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
24680 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
24690 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
246a0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
246b0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
246c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
246d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
246e0 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ne(Pager *pPager
246f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
24700 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
24710 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
24720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41  SQLITE_OK;..  PA
24730 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42  GERTRACE4("DATAB
24740 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
24750 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
24760 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
24770 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
24780 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
24790 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45 6e  runc);.  pagerEn
247a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  ter(pPager);..  
247b0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
247c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
247d0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
247e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
247f0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
24800 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
24810 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
24820 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
24830 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
24840 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
24850 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
24860 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
24870 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
24880 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66  dr *pPg;..#ifdef
24890 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
248a0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
248b0 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72  /* The atomic-wr
248c0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
248d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
248e0 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  all of the.    *
248f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  * following are 
24900 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  true:.    **.   
24910 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c   **    + The fil
24920 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
24930 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
24940 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
24950 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
24960 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
24970 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  size, and.    **
24980 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69      + This commi
24990 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
249a0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
249b0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
249c0 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74     **    + Exact
249d0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
249e0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
249f0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
24a00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
24a10 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
24a20 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
24a30 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e  an be used, then
24a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24a50 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20  e will never.   
24a60 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66   ** be created f
24a70 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
24a80 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
24a90 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69  int useAtomicWri
24aa0 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21  te = (.        !
24ab0 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20  zMaster && .    
24ac0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
24ad0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
24ae0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26  erSize(pPager) &
24af0 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e  & .        nTrun
24b00 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  c==0 && .       
24b10 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69   (0==pPager->pDi
24b20 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  rty || 0==pPager
24b30 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79  ->pDirty->pDirty
24b40 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
24b50 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20   useAtomicWrite 
24b60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
24b70 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  te the nRec fiel
24b80 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
24b90 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
24ba0 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61  int offset = pPa
24bb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24bc0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
24bd0 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61  lMagic);.      a
24be0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
24bf0 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63  ec==1);.      rc
24c00 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
24c10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73  Pager->jfd, offs
24c20 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  et, pPager->nRec
24c30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
24c40 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
24c50 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
24c60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
24c70 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20  ll will modify. 
24c80 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d       ** the in-m
24c90 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
24ca0 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74  tion of page 1 t
24cb0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
24cc0 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63  dated.      ** c
24cd0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
24ce0 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
24cf0 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20  e 1 directly to 
24d00 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
24d10 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61     ** file. Beca
24d20 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
24d30 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
24d40 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
24d50 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20  e-system, .     
24d60 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66 65   ** this is safe
24d70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
24d80 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
24d90 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
24da0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
24db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
24dc0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
24dd0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
24de0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
24df0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
24e00 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
24e10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73    }..    if( !us
24e20 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 0a 23  eAtomicWrite ).#
24e30 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
24e40 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
24e50 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
24e60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
24e70 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
24e80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
24e90 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
24ea0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
24eb0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
24ec0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
24ed0 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
24ee0 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
24ef0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
24f00 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
24f10 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
24f20 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
24f30 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
24f40 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
24f50 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
24f60 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
24f70 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
24f80 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
24f90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
24fa0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
24fb0 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
24fc0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
24fd0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
24fe0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
24ff0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
25000 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
25010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25020 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
25030 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  it;.#ifndef SQLI
25040 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25050 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72  UM.      if( nTr
25060 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
25070 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
25080 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
25090 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
250a0 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
250b0 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a   pages.        *
250c0 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
250d0 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
250e0 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
250f0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
25100 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
25110 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
25120 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20         Pgno i;. 
25130 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
25140 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
25150 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
25160 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
25170 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
25180 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
25190 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
251a0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
251b0 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
251c0 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b  i&7))) && i!=iSk
251d0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
251e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
251f0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
25200 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
25210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25220 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
25230 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
25240 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25250 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
25260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
25270 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
25280 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
25290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
252a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
252b0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
252c0 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
252d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
252e0 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
252f0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
25300 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
25310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25320 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
25330 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
25340 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
25350 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
25360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25370 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
25380 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  it;..#ifndef SQL
25390 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
253a0 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
253b0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
253c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
253d0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
253e0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
253f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25400 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
25410 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
25420 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
25430 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
25440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25450 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
25460 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
25470 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
25480 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
25490 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
254a0 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
254b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
254c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50  .      while( pP
254d0 67 20 26 26 20 21 70 50 67 2d 3e 64 69 72 74 79  g && !pPg->dirty
254e0 20 29 7b 20 70 50 67 20 3d 20 70 50 67 2d 3e 70   ){ pPg = pPg->p
254f0 44 69 72 74 79 3b 20 7d 0a 20 20 20 20 20 20 70  Dirty; }.      p
25500 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
25510 70 50 67 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pPg;.      goto 
25520 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
25530 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
25540 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rty = 0;..    /*
25550 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
25560 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
25570 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
25580 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
25590 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
255a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
255b0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
255c0 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
255d0 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
255e0 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
255f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
25600 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
25610 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
25620 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
25630 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25640 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
25650 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
25660 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
25670 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25680 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
25690 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
256a0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
256b0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
256c0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
256d0 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
256e0 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
256f0 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
25700 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
25710 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
25720 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
25730 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
25740 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
25750 69 74 27 73 0a 20 20 20 20 20 2a 20 62 65 74 74  it's.     * bett
25760 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  er to return SQL
25770 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a  ITE_BUSY..     *
25780 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
25790 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61  E_BUSY;.  }.  pa
257a0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
257b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
257c0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
257d0 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
257e0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
257f0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
25800 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
25810 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
25820 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
25830 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
25840 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
25850 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
25860 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
25870 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
25880 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
25890 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
258a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
258b0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
258c0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
258d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
258e0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
258f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
25910 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
25920 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
25930 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
25940 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
25950 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25960 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  R;.  }.  pagerEn
25970 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50  ter(pPager);.  P
25980 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
25990 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
259a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
259b0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
259c0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
259d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
259e0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
259f0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
25a00 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
25a10 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
25a20 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
25a30 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
25a40 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
25a50 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
25a60 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
25a70 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
25a80 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
25a90 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
25aa0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
25ab0 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
25ac0 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
25ad0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
25ae0 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
25af0 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ty;.    }.    pP
25b00 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
25b10 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
25b20 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
25b30 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
25b40 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
25b50 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
25b60 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
25b70 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
25b80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
25b90 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
25ba0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
25bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
25bc0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
25bd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
25be0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
25bf0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
25c00 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
25c10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
25c20 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
25c30 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
25c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
25c50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
25c60 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
25c70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
25c80 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25c90 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
25ca0 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70  GER_SYNCED || !p
25cb0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
25cc0 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  e );.  rc = page
25cd0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
25ce0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  n(pPager);.  rc 
25cf0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
25d00 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
25d10 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
25d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25d30 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
25d40 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
25d50 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
25d60 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
25d70 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
25d80 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
25d90 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
25da0 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
25db0 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
25dc0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
25dd0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
25de0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
25df0 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
25e00 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
25e10 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
25e20 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
25e30 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
25e40 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
25e50 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
25e60 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
25e70 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
25e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
25e90 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
25ea0 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
25eb0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
25ec0 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
25ed0 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
25ee0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
25ef0 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
25f00 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
25f10 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
25f20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
25f30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
25f40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
25f50 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
25f60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
25f70 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
25f80 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
25f90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
25fa0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
25fb0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
25fc0 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
25fd0 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
25fe0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
25ff0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
26000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26010 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
26020 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
26030 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
26040 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
26050 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
26060 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
26070 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
26080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26090 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
260a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
260b0 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
260c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
260d0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
260e0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
260f0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
26100 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
26110 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
26120 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
26130 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
26140 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
26150 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
26160 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
26170 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
26180 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
26190 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
261a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
261b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
261c0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
261d0 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
261e0 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
261f0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
26200 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
26210 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
26220 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
26230 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
26240 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
26250 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
26260 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
26270 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
26280 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
26290 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
262a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
262b0 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
262c0 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
262d0 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e  iter(p, pPager->
262e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
262f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
26300 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
26310 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
26320 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
26330 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
26340 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
26350 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
26360 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
26370 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
26380 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
26390 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
263a0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
263b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
263c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  E_OK;.  }..  pag
263d0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
263e0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
263f0 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
26400 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
26410 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
26420 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
26430 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
26440 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
26450 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
26460 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
26470 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26480 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
26490 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
264a0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
264b0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
264c0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
264d0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
264e0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
264f0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
26500 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
26510 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
26520 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
26530 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
26540 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
26550 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
26560 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
26570 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
26580 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  0);.    rc2 = pa
26590 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
265a0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
265b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
265c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
265d0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
265e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
265f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
26600 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f  ger, 0);.  }.  /
26610 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50  * pager_reset(pP
26620 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67  ager); */.  pPag
26630 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
26640 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
26650 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
26660 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
26670 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
26680 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
26690 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
266a0 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
266b0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
266c0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
266d0 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
266e0 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  t..  */.  rc = p
266f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
26700 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
26710 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
26720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26730 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
26740 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
26750 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
26760 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
26770 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
26780 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
26790 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
267a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
267b0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
267c0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
267d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
267e0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
267f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26800 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
26810 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
26820 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
26830 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
26840 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26850 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
26860 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
26870 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
26880 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26890 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
268a0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
268b0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
268c0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
268d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
268e0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
268f0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
26900 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
26910 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
26920 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
26930 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
26940 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
26950 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
26960 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
26970 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
26980 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
26990 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
269a0 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
269b0 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
269c0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
269d0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
269e0 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
269f0 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
26a00 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
26a10 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
26a20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
26a30 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
26a40 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
26a50 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
26a60 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
26a70 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
26a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
26a90 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
26aa0 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
26ab0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
26ac0 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
26ad0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
26ae0 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
26af0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
26b00 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
26b10 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
26b20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
26b30 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65 67  int pagerStmtBeg
26b40 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
26b50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
26b60 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
26b70 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
26b80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26b90 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
26ba0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
26bb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
26bc0 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
26bd0 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
26be0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26bf0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
26c00 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
26c10 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
26c20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
26c30 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
26c40 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
26c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26c60 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
26c70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
26c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
26c90 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
26ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26cb0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
26cc0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
26cd0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65  alOpen );.  page
26ce0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26cf0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
26d00 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
26d10 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64  cZero( pPager->d
26d20 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
26d30 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
26d40 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
26d50 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
26d60 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
26d70 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
26d80 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
26d90 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
26da0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
26db0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
26dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26dd0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
26de0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
26df0 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
26e00 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
26e10 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
26e20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26e30 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
26e40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
26e50 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
26e60 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
26e70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26e80 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
26e90 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
26ea0 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
26eb0 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
26ec0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
26ed0 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
26ee0 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
26ef0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
26f00 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
26f10 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
26f20 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73  emp(pPager->pVfs
26f30 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
26f40 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
26f50 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
26f60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
26f70 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
26f80 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
26f90 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
26fa0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
26fb0 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
26fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
26fd0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
26fe0 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
26ff0 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
27000 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
27010 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
27020 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
27030 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
27040 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
27050 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
27060 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
27070 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27080 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
27090 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
270a0 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
270b0 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  r);.  pagerLeave
270c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
270d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
270e0 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
270f0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
27100 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
27110 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
27120 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  {.  pagerEnter(p
27130 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
27140 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
27150 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
27160 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
27170 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
27180 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
27190 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
271a0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
271b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  ){.      /* sqli
271c0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
271d0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
271e0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
271f0 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  _free( pPager->a
27200 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
27210 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
27220 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
27230 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
27240 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
27250 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
27260 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
27270 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
27280 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
27290 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
272a0 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
272b0 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
272c0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
272d0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
272e0 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
272f0 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
27300 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
27310 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
27320 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
27330 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
27340 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
27350 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
27360 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27370 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
27380 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
27390 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
273a0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
273b0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
273c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
273d0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61  toopen = 0;.  pa
273e0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
273f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27400 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
27410 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
27420 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
27430 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
27440 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
27450 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27460 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
27470 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
27480 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
27490 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
274a0 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
274b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
274c0 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
274d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
274e0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
274f0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
27500 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  t;.      for(pPg
27510 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
27520 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e  pPg; pPg=pHist->
27530 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
27540 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
27550 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
27560 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
27570 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
27580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
27590 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
275a0 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
275b0 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
275c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
275d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
275e0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
275f0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
27600 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
27610 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27620 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
27630 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
27640 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67  tSize;.      pag
27650 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
27660 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
27670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27690 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
276a0 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
276b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
276c0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
276d0 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
276e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
276f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27700 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
27710 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67  oopen = 0;.  pag
27720 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27730 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27740 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
27750 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
27760 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
27770 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
27780 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
27790 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
277a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
277b0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
277c0 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
277d0 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
277e0 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
277f0 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
27800 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
27810 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
27820 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
27830 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
27840 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
27850 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
27860 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
27870 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
27880 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
27890 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
278a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
278b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
278c0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
278d0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
278e0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
278f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
27900 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
27910 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
27920 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
27930 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
27940 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
27950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27960 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
27970 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
27980 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
27990 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
279a0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
279b0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
279c0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
279d0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
279e0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
279f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
27a00 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
27a10 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
27a20 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
27a30 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
27a40 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
27a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
27a60 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
27a70 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
27a80 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
27a90 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
27aa0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
27ab0 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
27ac0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
27ad0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
27ae0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
27af0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
27b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27b10 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
27b20 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
27b30 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
27b40 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
27b50 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
27b60 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
27b70 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
27b80 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
27b90 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
27ba0 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
27bb0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
27bc0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
27bd0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
27be0 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
27bf0 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65   previous locate
27c00 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
27c10 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
27c20 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
27c30 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
27c40 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
27c50 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
27c60 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
27c70 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
27c80 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
27c90 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
27ca0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
27cb0 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
27cc0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
27cd0 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
27ce0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
27cf0 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
27d00 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
27d10 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
27d20 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
27d30 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
27d40 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
27d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
27d60 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
27d70 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
27d80 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
27d90 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
27da0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
27db0 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
27dc0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
27dd0 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
27de0 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
27df0 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
27e00 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
27e10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27e20 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ive)..*/.int sql
27e30 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
27e40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
27e50 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
27e60 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
27e70 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
27e80 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
27e90 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
27ea0 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
27eb0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
27ec0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
27ed0 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
27ee0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
27ef0 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
27f00 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
27f10 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
27f20 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
27f30 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
27f40 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
27f50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
27f60 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
27f70 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
27f80 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
27f90 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
27fa0 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
27fb0 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
27fc0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
27fd0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
27fe0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
27ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
28000 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
28010 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  t)pgno>pPager->o
28020 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
28030 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
28040 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
28050 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
28060 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
28070 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
28080 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
28090 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
280a0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
280b0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
280c0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
280d0 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
280e0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
280f0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
28100 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
28110 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
28120 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
28130 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
28140 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
28150 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
28160 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
28170 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
28180 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
28190 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
281a0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64    */.  pPg->need
281b0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f  Sync = 0;.  pPgO
281c0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
281d0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
281e0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
281f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
28200 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
28210 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
28220 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
28230 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
28240 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
28250 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
28260 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
28270 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
28280 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
28290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
282a0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
282b0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
282c0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
282d0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  ){.    pPg->inJo
282e0 75 72 6e 61 6c 20 3d 20 20 28 70 50 61 67 65 72  urnal =  (pPager
282f0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
28300 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
28310 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  &7)))!=0;.  }els
28320 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  e{.    pPg->inJo
28330 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
28340 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
28350 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29  Sync==0 || (int)
28360 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
28370 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a  gDbSize );.  }..
28380 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
28390 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
283a0 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69  pPg and insert i
283b0 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68  t into the new h
283c0 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20  ash-chain. */.  
283d0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
283e0 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  );.  pPg->pgno =
283f0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e   pgno;.  h = pgn
28400 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
28410 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61  sh-1);.  if( pPa
28420 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b  ger->aHash[h] ){
28430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28440 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
28450 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
28460 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
28470 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
28480 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
28490 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
284a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
284b0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
284c0 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  ] = pPg;.  pPg->
284d0 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a  pPrevHash = 0;..
284e0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
284f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
28500 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69  yCache = 1;..  i
28510 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
28520 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
28530 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
28540 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
28550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
28560 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
28570 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
28580 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
28590 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
285a0 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
285b0 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
285c0 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
285d0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
285e0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
285f0 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
28600 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61   Pager.aInJourna
28610 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73  l bit has been s
28620 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
28630 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
28640 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   loading.    ** 
28650 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
28660 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
28670 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
28680 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
28690 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
286a0 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   The sqlite3Page
286b0 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  rGet() call may 
286c0 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
286d0 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
286e0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
286f0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
28700 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
28710 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
28720 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20  t rc;.    PgHdr 
28730 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
28740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
28750 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
28760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
28770 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
28780 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
28790 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
287a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
287b0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
287c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
287d0 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53     pPgHdr->needS
287e0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
287f0 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  Hdr->inJournal =
28800 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74   1;.    makeDirt
28810 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
28820 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
28830 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
28840 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
28850 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28860 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
28870 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
28880 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28890 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
288a0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
288b0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
288c0 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
288d0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
288e0 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
288f0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
28900 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28910 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
28920 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
28930 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
28940 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
28950 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
28960 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
28970 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
28980 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
28990 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
289a0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
289b0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
289c0 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
289d0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
289e0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
289f0 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
28a00 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
28a10 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
28a20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
28a30 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
28a40 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
28a50 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
28a60 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
28a70 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
28a80 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
28a90 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
28aa0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
28ab0 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
28ac0 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
28ad0 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
28ae0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
28af0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
28b00 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
28b10 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
28b20 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
28b30 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
28b40 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
28b50 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
28b60 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
28b70 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
28b80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
28b90 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
28ba0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
28bb0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
28bc0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
28bd0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
28be0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
28bf0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
28c00 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
28c10 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
28c20 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
28c30 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
28c40 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
28c50 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
28c60 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
28c70 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
28c80 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
28c90 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
28ca0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
28cb0 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
28cc0 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
28cd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
28ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
28cf0 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
28d00 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
28d10 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
28d20 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23  lusiveMode;.}..#
28d30 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
28d40 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
28d50 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
28d60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28d70 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
28d80 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
28d90 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
28da0 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
28db0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
28dc0 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
28dd0 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
28de0 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
28df0 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
28e00 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
28e10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28e20 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  Lockstate(Pager 
28e30 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
28e40 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
28e50 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
28e60 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
28e70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
28e80 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
28e90 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
28ea0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
28eb0 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
28ec0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
28ed0 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
28ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28ef0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
28f00 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
28f10 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
28f20 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
28f30 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
28f40 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
28f50 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
28f60 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
28f70 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
28f80 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
28f90 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
28fa0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
28fb0 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
28fc0 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
28fd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
28fe0 49 4f 20 2a 2f 0a                                IO */.