/ Hex Artifact Content
Login

Artifact 0879439873a9da769ee400b3b8c0967afd786fe8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 37  : pager.c,v 1.37
0350: 31 20 32 30 30 37 2f 30 38 2f 32 33 20 31 34 3a  1 2007/08/23 14:
0360: 34 38 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  48:24 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0690: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
06a0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
06b0: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
06c0: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
06d0: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
06e0: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
06f0: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0700: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ument..*/.#defin
0710: 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69  e PAGERID(p) ((i
0720: 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66  nt)(p->fd)).#def
0730: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0740: 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a  (fd) ((int)fd)..
0750: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  /*.** The page c
0760: 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20  ache as a whole 
0770: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65  is always in one
0780: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0790: 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  g.** states:.**.
07a0: 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43  **   PAGER_UNLOC
07b0: 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  K        The pag
07c0: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63  e cache is not c
07d0: 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67  urrently reading
07e0: 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   or .**         
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
0800: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0810: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20  se file.  There 
0820: 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  is no.**        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0840: 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  ata held in memo
0850: 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ry.  This is the
0860: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20   initial.**     
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
0890: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
08a0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
08b0: 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74  che is reading t
08c0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73        Writing is
08f0: 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
0900: 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   There can be.**
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
0930: 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e  readers accessin
0940: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
0950: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
0970: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0980: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  me..**.**   PAGE
0990: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20  R_RESERVED      
09a0: 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73  This process has
09b0: 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61   reserved the da
09c0: 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69  tabase for writi
09d0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
09f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  has not yet made
0a00: 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f   any changes.  O
0a10: 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a  nly one process.
0a20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a30: 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69           at a ti
0a40: 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74  me can reserve t
0a50: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
0a60: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0a90: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
0aa0: 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72  odified so other
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0ad0: 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  ses may still be
0ae0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d   reading the on-
0af0: 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  disk.**         
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0b10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
0b20: 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55  **   PAGER_EXCLU
0b30: 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67  SIVE     The pag
0b40: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0b50: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0b60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b70: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0b80: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0b90: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0ba0: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0bc0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0bd0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0be0: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0c10: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  riting..**.**   
0c20: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
0c30: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f      The pager mo
0c40: 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74  ves to this stat
0c50: 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43  e from PAGER_EXC
0c60: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20  LUSIVE.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20  after all dirty 
0c90: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
0cb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cc0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0cd0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
0ce0: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
0cf0: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0d10: 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65  isk. All that re
0d20: 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74  mains to do is t
0d30: 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20  o remove or.**  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74 68       truncate th
0d60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
0d70: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d80: 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  on .**          
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c               wil
0da0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  l be committed..
0db0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0dc0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0dd0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0de0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0df0: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0e00: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0e10: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0e20: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e30: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e40: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e50: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e60: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e70: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e80: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e90: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0ea0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0eb0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0ec0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ed0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0ee0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ef0: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f00: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f10: 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  hat sqlite3Pager
0f20: 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  Write() can only
0f30: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f40: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f50: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f70: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f80: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0f90: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0fa0: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0fb0: 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45  ED.).** PAGER_RE
0fc0: 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61  SERVED means tha
0fd0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70  t there is an op
0fe0: 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  en rollback jour
0ff0: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e  nal..** The tran
1000: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1010: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1020: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1030: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
1040: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1050: 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69  file, though wri
1060: 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  tes to the rollb
1070: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f  ack.** journal o
1080: 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74 20  ccurs with just 
1090: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
10a0: 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65   After an sqlite
10b0: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
10c0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61  .** or sqlite3Pa
10d0: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
10e0: 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 63  o(), the state c
10f0: 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41  an go back to PA
1100: 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f  GER_SHARED,.** o
1110: 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61 74  r it can stay at
1120: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1130: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65 78   if we are in ex
1140: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
1150: 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ode..*/.#define 
1160: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
1170: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
1180: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20  R_SHARED      1 
1190: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41    /* same as SHA
11a0: 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  RED_LOCK */.#def
11b0: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
11c0: 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d  ED    2   /* sam
11d0: 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f  e as RESERVED_LO
11e0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
11f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
1200: 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45  4   /* same as E
1210: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f  XCLUSIVE_LOCK */
1220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1230: 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a  YNCED      5../*
1240: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
1250: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1260: 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65  LOCK macro is se
1270: 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d  t to true at com
1280: 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68  pile-time,.** th
1290: 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70  en failed attemp
12a0: 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73 65  ts to get a rese
12b0: 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69  rved lock will i
12c0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
12d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
12e0: 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75   is off by defau
12f0: 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c  lt.  To see why,
1300: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1310: 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
1320: 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65  :.** .** Suppose
1330: 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61 64   thread A alread
1340: 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  y has a shared l
1350: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20  ock and wants a 
1360: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a  reserved lock..*
1370: 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65 61  * Thread B alrea
1380: 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76 65  dy has a reserve
1390: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
13a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13b0: 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20  ck.  If.** both 
13c0: 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69 6e  threads are usin
13d0: 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61 6c  g their busy cal
13e0: 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74  lbacks, it might
13f0: 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a   be a long time.
1400: 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ** be for one of
1410: 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69 76   the threads giv
1420: 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20  e up and allows 
1430: 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f  the other to pro
1440: 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20  ceed..** But if 
1450: 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69 6e  the thread tryin
1460: 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 73  g to get the res
1470: 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73  erved lock gives
1480: 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28   up quickly.** (
1490: 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f  if it never invo
14a0: 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61 6c  kes its busy cal
14b0: 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20  lback) then the 
14c0: 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20  contention will 
14d0: 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71  be.** resolved q
14e0: 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64  uickly..*/.#ifnd
14f0: 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ef SQLITE_BUSY_R
1500: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64  ESERVED_LOCK.# d
1510: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53  efine SQLITE_BUS
1520: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1530: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1540: 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64  This macro round
1550: 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74  s values up so t
1560: 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  hat if the value
1570: 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69   is an address i
1580: 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65  t.** is guarante
1590: 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72  ed to be an addr
15a0: 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67  ess that is alig
15b0: 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65  ned to an 8-byte
15c0: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64   boundary..*/.#d
15d0: 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47  efine FORCE_ALIG
15e0: 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29  NMENT(X)   (((X)
15f0: 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45  +7)&~7)../*.** E
1600: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d  ach in-memory im
1610: 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62 65  age of a page be
1620: 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66 6f  gins with the fo
1630: 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e 0a  llowing header..
1640: 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 69  ** This header i
1650: 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20 74  s only visible t
1660: 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f 64  o this pager mod
1670: 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e 74  ule.  The client
1680: 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63 61  .** code that ca
1690: 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20 6f  lls pager sees o
16a0: 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68 61  nly the data tha
16b0: 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65  t follows the he
16c0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65  ader..**.** Clie
16d0: 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63  nt code should c
16e0: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
16f0: 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67  Write() on a pag
1700: 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e  e prior to makin
1710: 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63  g.** any modific
1720: 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70  ations to that p
1730: 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  age.  The first 
1740: 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61 67 65  time sqlite3Page
1750: 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63  rWrite().** is c
1760: 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69  alled, the origi
1770: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
1780: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
1790: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  to the rollback.
17a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  ** journal and P
17b0: 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61  gHdr.inJournal a
17c0: 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  nd PgHdr.needSyn
17d0: 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65  c are set.  Late
17e0: 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a  r, once.** the j
17f0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20  ournal page has 
1800: 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65  made it onto the
1810: 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50   disk surface, P
1820: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a  gHdr.needSync.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68   is cleared.  Th
1840: 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  e modified page 
1850: 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65  cannot be writte
1860: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
1870: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1880: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
1890: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
18a0: 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  s has been synce
18b0: 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68  d to disk and th
18c0: 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53  e.** PgHdr.needS
18d0: 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65  ync has been cle
18e0: 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ared..**.** The 
18f0: 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67  PgHdr.dirty flag
1900: 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c   is set when sql
1910: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1920: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
1930: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
1940: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
1950: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
1960: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1970: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1980: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1990: 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d 70 6f   Details of impo
19a0: 72 74 61 6e 74 20 73 74 72 75 63 74 75 72 65 20  rtant structure 
19b0: 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  elements:.**.** 
19c0: 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20  needSync.**.**  
19d0: 20 20 20 49 66 20 74 68 69 73 20 69 73 20 74 72     If this is tr
19e0: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
19f0: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
1a00: 66 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  fe to write the 
1a10: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74  page.**     cont
1a20: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
1a30: 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ase because the 
1a40: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1a50: 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20 20 66   needed.**     f
1a60: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61 73 20  or rollback has 
1a70: 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20 74 6f  not by synced to
1a80: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1a90: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 20  ck journal..**  
1aa0: 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20     The original 
1ab0: 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61 76 65  content may have
1ac0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ad0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ae0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62 75 74  urnal.**     but
1af0: 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
1b00: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 53 6f  been synced.  So
1b10: 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69 74 65   we cannot write
1b20: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b30: 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62 65 63  .**     file bec
1b40: 61 75 73 65 20 70 6f 77 65 72 20 66 61 69 6c 75  ause power failu
1b50: 72 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  re might cause t
1b60: 68 65 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  he page in the j
1b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1b80: 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65 61 63     to never reac
1b90: 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49 74 20  h the disk.  It 
1ba0: 69 73 20 61 73 20 69 66 20 74 68 65 20 77 72 69  is as if the wri
1bb0: 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1bc0: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 64 6f  l file.**     do
1bd0: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1be0: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  il the journal f
1bf0: 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
1c00: 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 54 68  *     .**     Th
1c10: 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65  is flag is false
1c20: 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
1c30: 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d 61 74  tent exactly mat
1c40: 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20 20 20  ches what.**    
1c50: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1c60: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1c70: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e 65 65  e file.  The nee
1c80: 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  dSync flag is al
1c90: 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73 65 20  so.**     false 
1ca0: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
1cb0: 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
1cc0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1cd0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  main rollback.**
1ce0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64       journal and
1cf0: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
1d00: 20 70 61 67 65 20 72 65 70 72 65 73 65 6e 74 73   page represents
1d10: 20 61 20 6e 65 77 20 70 61 67 65 20 74 68 61 74   a new page that
1d20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
1d30: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
1d40: 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1d50: 61 73 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ase during the c
1d60: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20 74 72  urrent.**     tr
1d70: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6e  ansaction, the n
1d80: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1d90: 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65 20 6f  true until the o
1da0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1db0: 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69 6e 20  .**     size in 
1dc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1dd0: 65 72 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  er has been sync
1de0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1df0: 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a 0a 2a  * inJournal.**.*
1e00: 2a 20 20 20 20 20 54 68 69 73 20 69 73 20 74 72  *     This is tr
1e10: 75 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e  ue if the origin
1e20: 61 6c 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  al page has been
1e30: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1e40: 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20 72 6f  e main.**     ro
1e50: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1e60: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1e70: 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20 70 61  false for new pa
1e80: 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  ges added to.** 
1e90: 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66 20 74      the end of t
1ea0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1eb0: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1ec0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
1ed0: 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68 69 73  .**     And this
1ee0: 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74 68 69   flag says nothi
1ef0: 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68 65 72  ng about whether
1f00: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
1f10: 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  nal.**     has b
1f20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1f30: 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73 20 74  sk.  For pages t
1f40: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 6f  hat are in the o
1f50: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 64  riginal.**     d
1f60: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1f70: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
1f80: 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  ession should al
1f90: 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a 2a 2a  ways be true:.**
1fa0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f 75 72  .**       inJour
1fb0: 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1fc0: 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e 6f 2d  InJournal[(pgno-
1fd0: 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28 70 67  1)/8] & (1<<((pg
1fe0: 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a 2a 0a  no-1)%8))!=0.**.
1ff0: 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65  **     The pPage
2000: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20  r->aInJournal[] 
2010: 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20 76 61  array is only va
2020: 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67  lid for the orig
2030: 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65  inal.**     page
2040: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2050: 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73  e, not new pages
2060: 20 74 68 61 74 20 61 72 65 20 61 64 64 65 64 20   that are added 
2070: 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20  to the end.**   
2080: 20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73    of the databas
2090: 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20  e, so obviously 
20a0: 74 68 65 20 61 62 6f 76 65 20 65 78 70 72 65 73  the above expres
20b0: 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  sion cannot be.*
20c0: 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20  *     valid for 
20d0: 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20  new pages.  For 
20e0: 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72  new pages inJour
20f0: 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e  nal is always 0.
2100: 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a  .**.** dirty.**.
2110: 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72 75 65  **     When true
2120: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
2130: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
2140: 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
2150: 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69  en.**     modifi
2160: 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
2170: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
2180: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2190: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20  file..**     If 
21a0: 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20  false, it means 
21b0: 74 68 61 74 20 65 69 74 68 65 72 20 74 68 65 20  that either the 
21c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
21d0: 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e  age is.**     un
21e0: 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20  changed or else 
21f0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75  the content is u
2200: 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77  nimportant and w
2210: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  e do not.**     
2220: 63 61 72 65 20 77 68 65 74 68 65 72 20 6f 72 20  care whether or 
2230: 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73 65 72  not it is preser
2240: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79  ved..**.** alway
2250: 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20  sRollback.**.** 
2260: 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74      This means t
2270: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  hat the sqlite3P
2280: 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
2290: 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65  () API should be
22a0: 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20  .**     ignored 
22b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e 20 20  for this page.  
22c0: 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  The DontRollback
22d0: 28 29 20 41 50 49 20 61 74 74 65 6d 70 74 73 20  () API attempts 
22e0: 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68  to say.**     th
22f0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2300: 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69  f the page on di
2310: 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e  sk is unimportan
2320: 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20  t (it is an.**  
2330: 20 20 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f     unused page o
2340: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 20  n the freelist) 
2350: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 75 6e  so that it is un
2360: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a  necessary to .**
2370: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68       rollback ch
2380: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 70 61  anges to this pa
2390: 67 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ge because the c
23a0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
23b0: 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68  ge.**     can ch
23c0: 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63 68 61  ange without cha
23d0: 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e  nging the meanin
23e0: 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
23f0: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20  e.  This.**     
2400: 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73 20 61  flag overrides a
2410: 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  ny DontRollback(
2420: 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73  ) attempt.  This
2430: 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20   flag is set.** 
2440: 20 20 20 20 77 68 65 6e 20 61 20 70 61 67 65 20      when a page 
2450: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20  that originally 
2460: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20  contained valid 
2470: 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
2480: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72 65 65  .**     the free
2490: 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20  list.  Later in 
24a0: 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
24b0: 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20  tion, this page 
24c0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20  might.**     be 
24d0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20  pulled from the 
24e0: 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75  freelist and reu
24f0: 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e  sed for somethin
2500: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20  g different.**  
2510: 20 20 20 61 6e 64 20 61 74 20 74 68 61 74 20 70     and at that p
2520: 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c  oint the DontRol
2530: 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c  lback() API will
2540: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75   be called becau
2550: 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  se.**     pages 
2560: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66  taken from the f
2570: 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e  reelist do not n
2580: 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63  eed to be protec
2590: 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68  ted by.**     th
25a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
25b0: 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c  al.  But this fl
25c0: 61 67 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ag says that the
25d0: 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20   page was.**    
25e0: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20   not originally 
25f0: 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2600: 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 20  list so that it 
2610: 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a  still needs to.*
2620: 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20  *     be rolled 
2630: 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
2640: 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20   any subsequent 
2650: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
2660: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  alls..**.** need
2670: 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Read .**.**     
2680: 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  This flag means 
2690: 28 77 68 65 6e 20 74 72 75 65 29 20 74 68 61 74  (when true) that
26a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26b0: 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20  the page has.** 
26c0: 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e      not yet been
26d0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
26e0: 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72  k.  The in-memor
26f0: 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73  y content is jus
2700: 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65  t.**     garbage
2710: 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65  .  (Actually, we
2720: 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   zero the conten
2730: 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c  t, but you shoul
2740: 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b  d not.**     mak
2750: 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e  e any assumption
2760: 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  s about the cont
2770: 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ent nevertheless
2780: 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20  .)  If the.**   
2790: 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65    content is nee
27a0: 64 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72  ded in the futur
27b0: 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  e, it should be 
27c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  read from the.**
27d0: 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61       original da
27e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
27f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
2800: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
2810: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
2820: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
2830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2840: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
2850: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
2860: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
2870: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
2880: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2890: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
28a0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
28b0: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
28c0: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
28d0: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
28e0: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
28f0: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
2900: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
2910: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
2920: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
2930: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
2940: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
2970: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e  pages */.  u8 in
2980: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
29a0: 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72  E if has been wr
29b0: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
29c0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20   */.  u8 dirty; 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
29f0: 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  we need to write
2a00: 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f   back changes */
2a10: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61    /* Sync journa
2a40: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
2a50: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2a60: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2a70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
2a80: 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f  * Disable DontRo
2a90: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69  llback() for thi
2aa0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e  s page */.  u8 n
2ab0: 65 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20  eedRead;        
2ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ad0: 61 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61  ad content if Pa
2ae0: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
2af0: 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20  lled */.  short 
2b00: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b20: 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74  er of users of t
2b30: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
2b40: 48 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50  Hdr *pDirty, *pP
2b50: 72 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20  revDirty;    /* 
2b60: 44 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20  Dirty pages */. 
2b70: 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20   u32 notUsed;   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 2f 2a 20 42 75 66 66 65 72 20 73 70 61 63 65 20  /* Buffer space 
2ba0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2bb0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
2bc0: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
2bd0: 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  dif.  /* pPager-
2be0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
2bf0: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
2c00: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
2c10: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
2c20: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
2c30: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
2c40: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
2c50: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61  .};../*.** For a
2c60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  n in-memory only
2c70: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20   database, some 
2c80: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
2c90: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62  n is recorded ab
2ca0: 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65  out.** each page
2cb0: 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73   so that changes
2cc0: 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
2cd0: 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66  ack.  (Journal f
2ce0: 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  iles are not.** 
2cf0: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
2d00: 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20  ry databases.)  
2d10: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  The following in
2d20: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64  formation is add
2d30: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64  ed to.** the end
2d40: 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20   of every EXTRA 
2d50: 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d  block for in-mem
2d60: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ory databases..*
2d70: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d  *.** This inform
2d80: 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ation could have
2d90: 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65   been added dire
2da0: 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64  ctly to the PgHd
2db0: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  r structure..** 
2dc0: 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c  But then it woul
2dd0: 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74  d take up an ext
2de0: 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74  ra 8 bytes of st
2df0: 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50  orage on every P
2e00: 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72  gHdr.** even for
2e10: 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61   disk-based data
2e20: 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e  bases.  Splittin
2e30: 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38  g it out saves 8
2e40: 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a   bytes.  This.**
2e50: 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e   is only a savin
2e60: 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74  gs of 0.8% but t
2e70: 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73  hose percentages
2e80: 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65   add up..*/.type
2e90: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73  def struct PgHis
2ea0: 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a  tory PgHistory;.
2eb0: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
2ec0: 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20   {.  u8 *pOrig; 
2ed0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
2ee0: 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74  page text.  Rest
2ef0: 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61  ore to this on a
2f00: 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a   full rollback *
2f10: 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20  /.  u8 *pStmt;  
2f20: 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74     /* Text as it
2f30: 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69   was at the begi
2f40: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
2f50: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
2f60: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
2f70: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
2f80: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
2f90: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
2fa0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
2fb0: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
2fe0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2ff0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  journal */.};../
3000: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
3010: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
3020: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
3030: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
3040: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
3050: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
3060: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
3070: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
3080: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
3090: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
30a0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
30b0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
30c0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
30d0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
30e0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
30f0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
3100: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3110: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
3120: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
3130: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
3140: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3150: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
3160: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
3170: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
3180: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
3190: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
31a0: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
31b0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
31c0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
31d0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
31e0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
31f0: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
3200: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
3210: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
3220: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
3230: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
3240: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3250: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
3260: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
3270: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
3280: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
3290: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
32a0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
32b0: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
32c0: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
32d0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
32e0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
32f0: 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65  e..**.** Pager.e
3300: 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65  rrCode may be se
3310: 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52  t to SQLITE_IOER
3320: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
3330: 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49  T, or.** or SQLI
3340: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
3350: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
3360: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
3370: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
3380: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
3390: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
33a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
33b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
33c0: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
33d0: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
33e0: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
33f0: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
3400: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
3410: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
3420: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
3430: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
3440: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
3450: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
3460: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
3470: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
3480: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
3490: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
34a0: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
34b0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
34c0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
34d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
34e0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
34f0: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
3500: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
3510: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
3520: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
3530: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3540: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
3550: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
3560: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
3570: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
3580: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
3590: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
35a0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
35b0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
35c0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
35d0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
35e0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
35f0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
3600: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
3630: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
3640: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
3650: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3660: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
3670: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3680: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
3690: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
36a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
36b0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
36c0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
36d0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
36e0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
36f0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
3700: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
3710: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
3720: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
3730: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
3760: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
3770: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
3780: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3790: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
37a0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
37b0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
37c0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
37d0: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
37e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
37f0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
3800: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
3810: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
3820: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
3830: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
3840: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
3850: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
3860: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3870: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3880: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3890: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
38a0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
38b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
38c0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
38d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
38e0: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
38f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3900: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
3910: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
3920: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
3930: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
3940: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3950: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
3960: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
3970: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
3980: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
3990: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
39a0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
39b0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
39c0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
39d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
39e0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
39f0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
3a00: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3a10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3a20: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3a30: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3a40: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3a50: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3a70: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3a80: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3a90: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65   cache */.  u8 e
3aa0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3ac0: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
3ad0: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
3ae0: 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e  IVE */.  u8 chan
3af0: 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20  geCountDone;    
3b00: 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65       /* Set afte
3b10: 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  r incrementing t
3b20: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
3b30: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  r */.  int errCo
3b40: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
3b50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
3b60: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
3b70: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
3b80: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3b90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3ba0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3bb0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
3bc0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
3bd0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
3be0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
3bf0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
3c00: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
3c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3c20: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
3c30: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
3c40: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
3c50: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
3c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3c70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
3c80: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
3c90: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
3ca0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
3cb0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
3cc0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
3cd0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
3ce0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
3cf0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
3d20: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3d30: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d50: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
3d60: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
3d70: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
3d80: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3da0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
3db0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
3dc0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
3dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3de0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
3df0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
3e00: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
3e30: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
3e40: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3e50: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3e70: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3e80: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3e90: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3ea0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
3ec0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
3ed0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
3ee0: 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ase */.  u8 *aIn
3ef0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3f00: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3f10: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3f20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3f30: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
3f40: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
3f50: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3f60: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3f80: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3f90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3fa0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3fb0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3fc0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3fe0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
3ff0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4000: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4020: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4030: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4040: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
4050: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
4060: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4070: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4080: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4090: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
40a0: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
40b0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
40c0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
40d0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
40e0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
40f0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4100: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
4110: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
4120: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
4130: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
4140: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
4150: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
4160: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
4170: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
4180: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
4190: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
41a0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
41b0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
41c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
41d0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
41e0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4200: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
4210: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
4220: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4230: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4250: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74  List of all dirt
4260: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34  y pages */.  i64
4270: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
4280: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4290: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
42a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
42b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
42c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
42d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
42e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
42f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4300: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
4310: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4320: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
4330: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
4340: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
4350: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
4380: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
4390: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
43a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
43c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
43d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
43e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4400: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
4410: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
4420: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
4430: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
4440: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
4450: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
4460: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
4470: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
4480: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
4490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
44a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
44b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
44c0: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
44d0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
44e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
44f0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
4500: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
4510: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
4520: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f  bPage*,int);   /
4530: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4540: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
4550: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
4560: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4570: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
4580: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
4590: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
45a0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
45b0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
45c0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
45d0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
45e0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
45f0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
4600: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73  endif.  int nHas
4610: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4620: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
4630: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4640: 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ble */.  PgHdr *
4650: 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  *aHash;         
4660: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
4670: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
4680: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
4690: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
46a0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
46b0: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
46c0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
46d0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79         /* Doubly
46e0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
46f0: 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20  pagers on which 
4700: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65  */.  Pager *pPre
4710: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4720: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   /* sqlite3_rele
4730: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c  ase_memory() wil
4740: 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20  l work */.  int 
4750: 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20  iInUseMM;       
4760: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
4770: 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62  ero if unavailab
4780: 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e  le to MM */.  in
4790: 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20  t iInUseDB;     
47a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
47b0: 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69  -zero if in sqli
47c0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
47d0: 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ry() */.#endif. 
47e0: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
47f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4800: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
4810: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
4820: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63  r tmp use */.  c
4830: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
4840: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
4850: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
4860: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
4870: 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nges */.};../*.*
4880: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4890: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
48a0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
48b0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
48c0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
48d0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
48e0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
48f0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4900: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4910: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4920: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4940: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4950: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4960: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4970: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4980: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4990: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
49a0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
49b0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
49c0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
49d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
49e0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
49f0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4a00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4a10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4a20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4a30: 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  al */.int sqlite
4a40: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
4a50: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4a60: 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  Number of cache 
4a70: 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23  pages freed */.#
4a80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4a90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4aa0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4ab0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ac0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4ad0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69  ing variable poi
4ae0: 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20  nts to the head 
4af0: 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b  of a double-link
4b00: 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  ed list.** of al
4b10: 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72  l pagers that ar
4b20: 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70  e eligible for p
4b30: 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20  age stealing by 
4b40: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72  the.** sqlite3_r
4b50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
4b60: 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65  interface.  Acce
4b70: 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  ss to this list 
4b80: 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20  is.** protected 
4b90: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55  by the SQLITE_MU
4ba0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20  TEX_STATIC_MEM2 
4bb0: 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66  mutex..*/.#ifdef
4bc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4bd0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
4be0: 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73  .static Pager *s
4bf0: 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
4c00: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  = 0;.#endif.../*
4c10: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4c20: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4c30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4c40: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4c50: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4c60: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4c70: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4c80: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4c90: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4ca0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4cb0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4cc0: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4cd0: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4ce0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4cf0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4d00: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4d10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4d20: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
4d30: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4d40: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4d50: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4d60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4d70: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4d80: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4d90: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4da0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4db0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4dc0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4dd0: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4de0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4df0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4e00: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4e10: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4e20: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4e30: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4e40: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4e50: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4e60: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4e80: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
4e90: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
4ea0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
4eb0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
4ec0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
4ed0: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
4ee0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
4ef0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
4f00: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
4f10: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
4f20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
4f30: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
4f40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
4f50: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
4f60: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
4f70: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
4f80: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
4f90: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
4fa0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
4fb0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
4fc0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
4fd0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
4fe0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
4ff0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5000: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5010: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5020: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
5030: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
5040: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
5050: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
5060: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
5070: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
5080: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
5090: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
50a0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
50b0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
50c0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
50d0: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
50e0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
50f0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5100: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5110: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5120: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
5140: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
5150: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
5160: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
5170: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
5180: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
5190: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
51a0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
51b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
51c0: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
51d0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
51e0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
51f0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5200: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5210: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5220: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5230: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5240: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5250: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
5260: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
5270: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
5280: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
5290: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
52a0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
52b0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
52c0: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
52d0: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
52e0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
52f0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5300: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5310: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5320: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5330: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5340: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5350: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
5360: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
5370: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
5380: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
5390: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
53a0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
53b0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
53c0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
53d0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
53e0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
53f0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5400: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5410: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5420: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5430: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5450: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
5460: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
5470: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
5480: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
5490: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
54a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
54b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
54c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
54d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
54e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
54f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5500: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5510: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5520: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5530: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5540: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5550: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5560: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5570: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5580: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5590: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
55a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
55b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
55c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
55d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
55e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
55f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5600: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5610: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5620: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5630: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5640: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5650: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5660: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5670: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5680: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5690: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
56a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
56b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
56c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
56d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
56e0: 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29 20  he pagerEnter() 
56f0: 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28 29  and pagerLeave()
5700: 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72   routines acquir
5710: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a  e and release.**
5720: 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68   a mutex on each
5730: 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74   pager.  The mut
5740: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ex is recursive.
5750: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
5760: 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65   special-purpose
5770: 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79   mutex.  It only
5780: 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c   provides mutual
5790: 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65   exclusion.** be
57a0: 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65 20  tween the Btree 
57b0: 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d  and the Memory M
57c0: 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65  anagement sqlite
57d0: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
57e0: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  ().** function. 
57f0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65   It does not pre
5800: 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  vent, for exampl
5810: 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66 72  e, two Btrees fr
5820: 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20  om accessing.** 
5830: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
5840: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5850: 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d    Other general-
5860: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20  purpose mutexes 
5870: 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  in.** the btree 
5880: 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61  layer handle tha
5890: 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64  t chore..*/.#ifd
58a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
58b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
58c0: 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  NT.  static void
58d0: 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67 65   pagerEnter(Page
58e0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
58f0: 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66  nUseDB++;.    if
5900: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26  ( p->iInUseMM &&
5910: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20   p->iInUseDB==1 
5920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5930: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5940: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5950: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5960: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5970: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
5980: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5990: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
59a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
59b0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
59c0: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
59d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
59e0: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
59f0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5a00: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
5a10: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
5a20: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
5a30: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5a40: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
5a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
5a60: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
5a70: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
5a80: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
5a90: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
5aa0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
5ab0: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
5ac0: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
5ad0: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
5ae0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
5af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
5b00: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
5b10: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
5b20: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
5b30: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
5b40: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
5b50: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
5b60: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
5b70: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
5b80: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
5b90: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
5ba0: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
5bb0: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
5bc0: 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22  %-3d total=%d\n"
5bd0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
5be0: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
5bf0: 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e  p), p->nRef, p->
5c00: 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20  pPager->nRef.   
5c10: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
5c20: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
5c30: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
5c40: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
5c50: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
5c60: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
5c70: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
5c80: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
5c90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
5ca0: 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70   true if page *p
5cb0: 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  Pg has already b
5cc0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
5cd0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
5ce0: 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74  journal (or stat
5cf0: 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68  ement snapshot h
5d00: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  as been created,
5d10: 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74   if *pPg is part
5d20: 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d  .** of an in-mem
5d30: 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  ory database)..*
5d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
5d50: 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48  eInStatement(PgH
5d60: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
5d70: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
5d80: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d  >pPager;.  if( M
5d90: 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75  EMDB ){.    retu
5da0: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  rn PGHDR_TO_HIST
5db0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69  (pPg, pPager)->i
5dc0: 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nStmt;.  }else{.
5dd0: 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
5de0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75  pPg->pgno;.    u
5df0: 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61  8 *a = pPager->a
5e00: 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75  InStmt;.    retu
5e10: 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67  rn (a && (int)pg
5e20: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
5e30: 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f  Size && (a[pgno/
5e40: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
5e50: 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ))));.  }.}../*.
5e60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
5e70: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
5e80: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e  hash table to N.
5e90: 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f    N must be a po
5ea0: 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a  wer.** of two..*
5eb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
5ec0: 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
5ed0: 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61  table(Pager *pPa
5ee0: 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50  ger, int N){.  P
5ef0: 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70  gHdr **aHash, *p
5f00: 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  Pg;.  assert( N>
5f10: 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d  0 && (N&(N-1))==
5f20: 30 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  0 );.  pagerLeav
5f30: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61 48 61  e(pPager);.  aHa
5f40: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
5f50: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
5f60: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
5f70: 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
5f80: 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d  r);.  if( aHash=
5f90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5fa0: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5fb0: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5fc0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5fd0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5fe0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
5ff0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6000: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
6010: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
6020: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
6030: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
6040: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6050: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6060: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
6070: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
6080: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
6090: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
60a0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
60b0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
60c0: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
60d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
60e0: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
60f0: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
6100: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
6110: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
6120: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
6130: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
6140: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
6150: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
6160: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
6170: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
6180: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6190: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
61a0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
61b0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
61c0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
61d0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
61e0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
61f0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
6200: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
6210: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
6220: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
6230: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6240: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
6250: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
6260: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
6270: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
6280: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
6290: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
62a0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
62b0: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
62c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
62d0: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
62e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
62f0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
6300: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
6310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6320: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
6330: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
6340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6350: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
6360: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
6370: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
6380: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
6390: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
63a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
63b0: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
63c0: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
63d0: 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72  *)A,B)../*.** Wr
63e0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
63f0: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
6400: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
6410: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
6420: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
6430: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
6440: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
6450: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
6460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6470: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
6480: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
6490: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
64a0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
64b0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
64c0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
64d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
64e0: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
64f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c  .}../*.** If fil
6500: 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63  e pFd is open, c
6510: 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  all sqlite3OsUnl
6520: 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  ock() on it..*/.
6530: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c  static int osUnl
6540: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
6550: 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b   *pFd, int eLock
6560: 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70  ){.  if( !pFd->p
6570: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
6580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
65a0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
65b0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
65c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
65d0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
65e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
65f0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
6600: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
6610: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
6620: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6630: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6640: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6650: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6660: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6670: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6680: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6690: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
66a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
66b0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
66c0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
66d0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
66e0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
66f0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
6700: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
6710: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
6720: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
6730: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6740: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  on cannot be use
6750: 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  d, 0 is returned
6760: 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75  . If it can be u
6770: 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sed,.** then the
6780: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6790: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
67a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
67b0: 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61  when it.** conta
67c0: 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74  ins rollback dat
67d0: 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e  a for exactly on
67e0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  e page..*/.#ifde
67f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6800: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61  ATOMIC_WRITE.sta
6810: 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66  tic int jrnlBuff
6820: 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  erSize(Pager *pP
6830: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b  ager){.  int dc;
6840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
6850: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
6860: 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  tics */.  int nS
6870: 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53  ector;      /* S
6880: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
6890: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
68a0: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
68b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
68c0: 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
68d0: 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d  d;..  if( fd->pM
68e0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63  ethods ){.    dc
68f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
6900: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
6910: 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  s(fd);.    nSect
6920: 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  or = sqlite3OsSe
6930: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
6940: 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72    nPage = pPager
6950: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
6960: 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45  .  assert(SQLITE
6970: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
6980: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61  ==(512>>8));.  a
6990: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
69a0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
69b0: 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66  5536>>8));..  if
69c0: 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ( !fd->pMethods 
69d0: 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45 5f 49  || (dc&(SQLITE_I
69e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61  OCAP_ATOMIC|(nPa
69f0: 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74 6f 72  ge>>8))&&nSector
6a00: 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  <=nPage) ){.    
6a10: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
6a20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6a30: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
6a40: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
6a50: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
6a60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6a70: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
6a80: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
6a90: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
6aa0: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
6ab0: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
6ac0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
6ad0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
6ae0: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
6af0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
6b00: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
6b10: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
6b20: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
6b30: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
6b40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
6b50: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6b60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6b70: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
6b80: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
6b90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6ba0: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
6bb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
6bc0: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
6bd0: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
6be0: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
6bf0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
6c00: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
6c10: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
6c20: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
6c30: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
6c40: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
6c50: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
6c60: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6c70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
6c80: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
6c90: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
6ca0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
6cb0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
6cc0: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
6cd0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
6ce0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
6cf0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
6d00: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
6d10: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
6d20: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
6d30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
6d40: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
6d50: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
6d60: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
6d70: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
6d80: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
6d90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6da0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
6db0: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
6dc0: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
6dd0: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
6de0: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
6df0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
6e00: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
6e10: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
6e20: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
6e30: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
6e40: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
6e50: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
6e60: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
6e70: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
6e80: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
6e90: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
6ea0: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
6eb0: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
6ec0: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
6ed0: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
6ee0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6ef0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
6f00: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
6f10: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
6f20: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
6f30: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
6f40: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
6f50: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
6f60: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
6f70: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
6f80: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
6f90: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 6e 73              (uns
6fb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48  igned char *)PGH
6fc0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65  DR_TO_DATA(pPage
6fd0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
6fe0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
6ff0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
7000: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
7010: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
7020: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
7030: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
7040: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
7050: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
7060: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
7070: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
7080: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
7090: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
70a0: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
70b0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
70c0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
70d0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
70e0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
70f0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
7100: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7110: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7120: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
7130: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
7140: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
7150: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
7160: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
7170: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
7180: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
7190: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
71a0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
71b0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
71c0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
71d0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
71e0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
71f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
7200: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
7210: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
7220: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
7230: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
7240: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
7250: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
7260: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
7270: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
7280: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
7290: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
72a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
72b0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 2a  ite3_malloc(). *
72c0: 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73  pzMaster is.** s
72d0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  et to point at t
72e0: 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  he memory and SQ
72f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
7300: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
7310: 74 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 72 65  t.** sqlite3_fre
7320: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
7330: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
7340: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
7350: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
7360: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
7370: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
7380: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
73a0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
73b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
73c0: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
73d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
73e0: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
73f0: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
7400: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
7410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
7420: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
7430: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
7440: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
7450: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
7460: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7470: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
7480: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
7490: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
74a0: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
74b0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
74c0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
74d0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20  zJ-16, &len);.  
74e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
74f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7500: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7510: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
7520: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
7530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7540: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7550: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
7560: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
7570: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
7580: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
7590: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
75a0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
75b0: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
75c0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
75d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61  char *)sqlite3Ma
75e0: 6c 6c 6f 63 5a 65 72 6f 28 6c 65 6e 2b 31 29 3b  llocZero(len+1);
75f0: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
7600: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
7610: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7620: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
7630: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
7640: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
7650: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
7660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
7680: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
7690: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
76a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
76b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
76c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
76d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
76e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
76f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
7700: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
7710: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
7720: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
7730: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
7740: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
7750: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
7760: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
7770: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
7780: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
7790: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
77a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
77b0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
77c0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
77d0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
77e0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
77f0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
7800: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
7810: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
7820: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7830: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
7840: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
7850: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
7860: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
7870: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
7880: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
7890: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
78a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
78b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
78c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
78d0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
78e0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
78f0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
7900: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
7910: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
7920: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
7930: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
7940: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
7950: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
7960: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
7970: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
7980: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
7990: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
79a0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
79b0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
79e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
79f0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
7a00: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
7a10: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
7a20: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
7a30: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
7a40: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
7a50: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
7a60: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
7a70: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
7a80: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
7a90: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
7aa0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
7ab0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7ac0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
7ad0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
7ae0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
7af0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
7b00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7b10: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
7b20: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
7b30: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7b40: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
7b50: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
7b60: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
7b70: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
7b80: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
7b90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7ba0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
7bb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7bc0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7bd0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7be0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7bf0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7c00: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7c10: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7c20: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
7c30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
7c40: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
7c50: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
7c60: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
7c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
7c80: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7c90: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7ca0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7cc0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7cd0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7ce0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7cf0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7d00: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7d10: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7d20: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
7d30: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
7d40: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
7d50: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
7d60: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
7d70: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
7d80: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7d90: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7da0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
7db0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7dc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
7dd0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
7de0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
7df0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
7e00: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
7e10: 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48  ager){.  char zH
7e20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7e30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b  urnalMagic)+16];
7e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
7e50: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
7e60: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
7e70: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
7e80: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
7e90: 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73  nalOff;.  }..  s
7ea0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7eb0: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
7ec0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
7ed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7ee0: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  ;..  memcpy(zHea
7ef0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
7f00: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
7f10: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f  nalMagic));..  /
7f20: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
7f30: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
7f40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
7f50: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
7f60: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
7f70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
7f80: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
7f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
7fa0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
7fb0: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
7fc0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
7fd0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
7fe0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
7ff0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
8000: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
8010: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
8020: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
8030: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
8040: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
8050: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
8060: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
8070: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
8080: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
8090: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
80a0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
80b0: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
80c0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
80d0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
80e0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
80f0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
8100: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
8110: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8120: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
8130: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
8140: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
8150: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
8160: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8170: 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
8180: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
8190: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
81a0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
81b0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
81c0: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
81d0: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
81e0: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
81f0: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
8200: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
8210: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
8220: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
8230: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
8240: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
8250: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
8260: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
8270: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
8280: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
8290: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
82a0: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
82b0: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
82c0: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
82d0: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
82e0: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
82f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
8300: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70  .  */.  assert(p
8310: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
8320: 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53  ods||pPager->noS
8330: 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61  ync);.  if( (pPa
8340: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20  ger->noSync) .  
8350: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
8360: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
8370: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
8380: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
8390: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
83a0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
83b0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
83c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
83d0: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
83e0: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
83f0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8400: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8410: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
8420: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
8430: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
8440: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
8450: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
8460: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
8470: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
8480: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
8490: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
84a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
84b0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
84c0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
84d0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
84e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
84f0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8510: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
8520: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
8530: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8540: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8550: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8560: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8570: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8580: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8590: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
85a0: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
85b0: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
85c0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
85d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
85e0: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
85f0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
8600: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
8610: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
8620: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
8630: 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  ,pPager->journal
8640: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
8650: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
8660: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8670: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ger);..  /* The 
8680: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
8690: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
86a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
86b0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
86c0: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
86d0: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
86e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
86f0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8700: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
8710: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54  TE_OK ){.    IOT
8720: 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20  RACE(("JTAIL %p 
8730: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
8740: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8750: 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d  Off-1)).    rc =
8760: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8770: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
8780: 30 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e  00", 1, pPager->
8790: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
87a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
87b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
87c0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
87d0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
87e0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
87f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
8800: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
8810: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
8820: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
8830: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
8840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8850: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
8860: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8870: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8880: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
8890: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
88a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
88b0: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
88c0: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
88d0: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
88e0: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
88f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
8900: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
8910: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
8920: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
8930: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
8940: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
8950: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
8960: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
8970: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
8980: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
8990: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
89a0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
89b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
89c0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
89d0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
89e0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
89f0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8a00: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8a10: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
8a20: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
8a30: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
8a40: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
8a50: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
8a60: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
8a70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8a80: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
8a90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
8aa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
8ab0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8ac0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
8ad0: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
8ae0: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
8af0: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
8b00: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
8b10: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
8b20: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
8b30: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
8b40: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
8b50: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
8b60: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
8b70: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72  ader */.  i64 jr
8b80: 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f  nlOff;..  seekJo
8b90: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
8ba0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8bb0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
8bc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
8bd0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
8be0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8bf0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
8c00: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
8c10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
8c20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c30: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
8c40: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
8c50: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
8c60: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
8c70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
8c80: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
8c90: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
8ca0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
8cb0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
8cc0: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
8cd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8ce0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
8cf0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
8d10: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
8d20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8d30: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
8d40: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
8d50: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
8d60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8d70: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
8d80: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8d90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
8da0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
8db0: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
8dc0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
8dd0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
8de0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
8df0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
8e00: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
8e10: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
8e20: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
8e30: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
8e40: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
8e50: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
8e60: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
8e70: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
8e80: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
8e90: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
8ea0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
8eb0: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
8ec0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
8ed0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
8ee0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
8ef0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
8f00: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
8f10: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
8f20: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
8f30: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8f40: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32  jrnlOff+12, (u32
8f50: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
8f60: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
8f70: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
8f80: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8f90: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
8fa0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
8fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8fc0: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
8fd0: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
8fe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8ff0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
9000: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
9010: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
9020: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
9030: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
9040: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9050: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
9060: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
9070: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
9080: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
9090: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
90a0: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
90b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
90c0: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
90d0: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
90e0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
90f0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
9100: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
9110: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
9120: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
9130: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
9140: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
9150: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
9160: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
9170: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
9180: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
9190: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
91a0: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
91b0: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
91c0: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
91d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
91e0: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
91f0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
9200: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
9210: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
9220: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
9230: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
9240: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
9250: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
9260: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
9270: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9280: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9290: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
92a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
92b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
92c0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
92d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
92e0: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
92f0: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
9300: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
9310: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
9320: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9330: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
9340: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
9350: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
9360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9370: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
9380: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
9390: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
93a0: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
93b0: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
93c0: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
93d0: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
93e0: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
93f0: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9400: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9410: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9420: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9430: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9440: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9450: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9460: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9470: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9480: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9490: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
94a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
94b0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65  lSync ){.    see
94c0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
94d0: 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  er);.  }.  jrnlO
94e0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
94f0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
9500: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9510: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
9520: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9530: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
9540: 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
9550: 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  NO(pPager));.  i
9560: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9570: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9580: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20  jrnlOff += 4;.. 
9590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
95a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
95b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
95c0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
95d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
95e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e  return rc;.  jrn
95f0: 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20  lOff += len;..  
9600: 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20  put32bits(zBuf, 
9610: 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74  len);.  put32bit
9620: 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75  s(&zBuf[4], cksu
9630: 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  m);.  memcpy(&zB
9640: 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d  uf[8], aJournalM
9650: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
9660: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
9670: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9680: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9690: 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28   zBuf, 8+sizeof(
96a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20  aJournalMagic), 
96b0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67  jrnlOff);.  pPag
96c0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
96d0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
96e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
96f0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
9700: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
9710: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
9720: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
9730: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
9740: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
9750: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
9760: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
9770: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
9780: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
9790: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
97a0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
97b0: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
97c0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
97d0: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
97e0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
97f0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
9800: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
9810: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
9820: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
9830: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
9840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
9850: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
9860: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
9870: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
9880: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
9890: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
98a0: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
98b0: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
98c0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
98d0: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
98e0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
98f0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
9900: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
9910: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
9920: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
9930: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
9940: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
9950: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
9960: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
9970: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
9980: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
9990: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
99a0: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
99b0: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
99c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
99d0: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
99e0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
99f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
9a00: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
9a10: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
9a20: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
9a30: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
9a40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
9a50: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
9a60: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
9a70: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
9a80: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
9a90: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9aa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
9ab0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
9ac0: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
9ad0: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
9ae0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
9af0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
9b00: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
9b10: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
9b20: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
9b30: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
9b40: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
9b50: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
9b60: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
9b70: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
9b80: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
9b90: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
9ba0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9bb0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
9bc0: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  MDB ){.      osU
9bd0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
9be0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
9bf0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9c00: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
9c10: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
9c20: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
9c30: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
9c40: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
9c50: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
9c60: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
9c70: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
9c80: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
9c90: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
9ca0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
9cb0: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
9cc0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
9cd0: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
9ce0: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
9cf0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
9d00: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
9d10: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
9d20: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
9d30: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
9d40: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
9d50: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
9d60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
9d70: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
9d80: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
9d90: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
9da0: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
9db0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
9dc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
9dd0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
9de0: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
9df0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
9e00: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
9e10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
9e20: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
9e30: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
9e40: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
9e50: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
9e60: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
9e70: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
9e80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
9e90: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
9ea0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
9eb0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
9ec0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
9ed0: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
9ee0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
9ef0: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
9f00: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
9f10: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
9f20: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
9f30: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
9f40: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
9f50: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
9f60: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
9f70: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
9f80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9f90: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
9fa0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
9fb0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
9fc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
9fd0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
9fe0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
9ff0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
a000: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
a010: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
a020: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
a030: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
a040: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
a050: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
a060: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
a070: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
a080: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  All;.    sqlite3
a090: 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  _free(pPg);.  }.
a0a0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
a0b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
a0c0: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
a0d0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
a0e0: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
a0f0: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
a100: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
a110: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
a120: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
a130: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
a140: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
a150: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
a160: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
a170: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
a180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a190: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
a1a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74  ransaction.  A t
a1b0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
a1c0: 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a  ded by either.**
a1d0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
a1e0: 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57  OLLBACK..**.** W
a1f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
a200: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
a210: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
a220: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
a230: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
a240: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
a250: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
a260: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
a270: 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a  ne will release.
a280: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
a290: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
a2a0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
a2b0: 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20  in its place if 
a2c0: 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61  that is.** the a
a2d0: 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67  ppropriate thing
a2e0: 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65   to do.  Release
a2f0: 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69   locks usually i
a300: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a  s appropriate,.*
a310: 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * unless we are 
a320: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
a330: 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65  ess mode or unle
a340: 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a  ss this is a .**
a350: 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49   COMMIT AND BEGI
a360: 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e  N or ROLLBACK AN
a370: 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f  D BEGIN operatio
a380: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  n..**.** The jou
a390: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74  rnal file is eit
a3a0: 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74  her deleted or t
a3b0: 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  runcated..**.** 
a3c0: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
a3d0: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
a3e0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
a3f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
a400: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
a410: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
a420: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
a430: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
a440: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
a450: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
a460: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
a470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a480: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
a490: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
a4a0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a4b0: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a4c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
a4d0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
a4e0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
a4f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
a500: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
a510: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
a520: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a530: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
a540: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
a550: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a560: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
a570: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
a580: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
a590: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
a5a0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
a5b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
a5c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
a5d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a5e0: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pen ){.    if( p
a5f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
a600: 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20  Mode .          
a610: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
a620: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
a630: 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c  r->jfd, 0))==SQL
a640: 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20  ITE_OK ){;.     
a650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a660: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
a670: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
a680: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d  arted = 0;.    }
a690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
a6a0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
a6b0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
a6c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
a6d0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
a6e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a6f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a700: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
a710: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
a720: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
a730: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a740: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
a750: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
a760: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
a770: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
a780: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
a790: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a7a0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a7b0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
a7c0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
a7d0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
a7e0: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
a7f0: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
a800: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77  ;.      pPg->alw
a810: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
a820: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a830: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
a840: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a850: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a860: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a870: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
a880: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
a890: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
a8a0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
a8b0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
a8c0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
a8d0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
a8e0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
a8f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a900: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
a910: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
a920: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  al==0 );.  }..  
a930: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a940: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a950: 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b    rc2 = osUnlock
a960: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
a970: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
a980: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
a990: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
a9a0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
a9b0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
a9c0: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
a9d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
a9e0: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
a9f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
aa00: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
aa10: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
aa20: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
aa30: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
aa40: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
aa50: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
aa60: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
aa70: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
aa80: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
aa90: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
aaa0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
aab0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
aac0: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
aad0: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
aae0: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
aaf0: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
ab00: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
ab10: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
ab20: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
ab30: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
ab40: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
ab50: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
ab60: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
ab70: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
ab80: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
ab90: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
aba0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
abb0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
abc0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
abd0: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
abe0: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
abf0: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
ac00: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
ac10: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
ac20: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
ac30: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
ac40: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
ac50: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
ac60: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
ac70: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
ac80: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
ac90: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
aca0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
acb0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
acc0: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
acd0: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
ace0: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
acf0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
ad00: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
ad10: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
ad20: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
ad30: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
ad40: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
ad50: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
ad60: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
ad70: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
ad80: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
ad90: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
ada0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
adb0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
adc0: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
add0: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
ade0: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
adf0: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
ae00: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
ae10: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
ae20: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
ae30: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
ae40: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
ae50: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
ae60: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
ae70: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
ae80: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
ae90: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
aea0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
aec0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
aed0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
aee0: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
aef0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
af00: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
af10: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
af20: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
af30: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
af40: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
af50: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
af60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
af70: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
af80: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
af90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
afa0: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
afb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
afc0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
afd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
afe0: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
aff0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
b000: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
b010: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
b020: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
b030: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
b040: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
b050: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
b060: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
b070: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
b080: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
b090: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
b0a0: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
b0b0: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
b0c0: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
b0d0: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
b0e0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
b0f0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
b100: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
b110: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
b120: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
b130: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
b140: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
b150: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b170: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
b180: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
b190: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
b1c0: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
b1d0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
b1e0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b200: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
b210: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
b220: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
b230: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
b240: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
b250: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
b260: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
b270: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
b280: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
b290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
b2a0: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
b2b0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
b2c0: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
b2d0: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
b2e0: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
b2f0: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
b300: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
b310: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
b320: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
b330: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
b340: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
b350: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
b360: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
b370: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
b380: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
b390: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
b3a0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
b3b0: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
b3c0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
b3d0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
b3e0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
b3f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
b400: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
b410: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
b420: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
b430: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
b440: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
b450: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
b460: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
b470: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
b480: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
b490: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
b4a0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
b4b0: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
b4c0: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
b4d0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
b4e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
b4f0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
b500: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
b510: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
b520: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
b530: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
b540: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
b550: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
b560: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
b570: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b580: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
b590: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
b5a0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
b5b0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
b5c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b5d0: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
b5e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
b5f0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
b600: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
b610: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
b620: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b630: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
b640: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b650: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
b660: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
b670: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
b680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b690: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
b6a0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
b6b0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
b6c0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
b6d0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
b6e0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
b6f0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
b700: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
b710: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
b720: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
b730: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
b740: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
b750: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
b760: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
b770: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
b780: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
b790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b7a0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
b7b0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
b7c0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
b7d0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
b7e0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
b7f0: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
b800: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
b810: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
b820: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
b830: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
b840: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
b850: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
b860: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
b870: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
b880: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
b890: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
b8a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
b8b0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
b8c0: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
b8d0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
b8e0: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
b8f0: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
b900: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
b910: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b920: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
b930: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
b940: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
b950: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
b960: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
b970: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
b980: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
b990: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
b9a0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
b9b0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
b9c0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
b9d0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
b9e0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
b9f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ba00: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
ba10: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
ba20: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
ba30: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
ba40: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
ba50: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
ba60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
ba70: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
ba80: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
ba90: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
baa0: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
bab0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
bac0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
bad0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
bae0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
baf0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
bb00: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
bb10: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
bb20: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
bb30: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
bb40: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
bb50: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
bb60: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
bb70: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
bb80: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
bb90: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
bba0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
bbb0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
bbc0: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
bbd0: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
bbe0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
bbf0: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
bc00: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
bc10: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
bc20: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
bc30: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
bc40: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
bc50: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
bc60: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
bc70: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
bc80: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
bc90: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
bca0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
bcb0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
bcc0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
bcd0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
bce0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
bcf0: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
bd00: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
bd10: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
bd20: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
bd30: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
bd40: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
bd50: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
bd60: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
bd70: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
bd80: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
bd90: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
bda0: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
bdb0: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
bdc0: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
bdd0: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
bde0: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
bdf0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
be00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
be10: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
be20: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
be30: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
be40: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
be50: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
be60: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
be70: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
be80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
be90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bea0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
beb0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
bec0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
bed0: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
bee0: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
bef0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
bf00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
bf10: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
bf20: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
bf30: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
bf40: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
bf50: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
bf60: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
bf70: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
bf80: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
bf90: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
bfa0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
bfb0: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
bfc0: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
bfd0: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
bfe0: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
bff0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
c000: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
c010: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
c020: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
c030: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
c040: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
c050: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
c060: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
c070: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
c080: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
c090: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
c0a0: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
c0b0: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
c0c0: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
c0d0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
c0e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
c0f0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
c100: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
c110: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
c120: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
c130: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
c140: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c150: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
c160: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c170: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
c180: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
c190: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
c1a0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
c1b0: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
c1c0: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
c1d0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
c1e0: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
c1f0: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
c200: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
c210: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
c220: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
c230: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
c240: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
c250: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c260: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
c270: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
c280: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
c290: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
c2a0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
c2b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c2c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
c2d0: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
c2e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
c2f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c300: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
c310: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
c320: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
c330: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c340: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
c350: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
c360: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c370: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
c380: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c390: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c3a0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
c3b0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
c3c0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
c3d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c3e0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
c3f0: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
c400: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
c410: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
c420: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
c430: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
c440: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
c450: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
c460: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
c470: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
c480: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
c490: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
c4a0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
c4b0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
c4c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
c4d0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
c4e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c4f0: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
c500: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
c510: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
c520: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
c530: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
c540: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
c550: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
c560: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
c570: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
c580: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
c590: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
c5a0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
c5b0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
c5c0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
c5d0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
c5e0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
c5f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c610: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
c620: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
c630: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
c640: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
c650: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
c660: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
c670: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
c680: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
c690: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
c6a0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
c6b0: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
c6c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
c6d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
c6e0: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
c6f0: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
c700: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
c710: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
c720: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
c730: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
c740: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
c750: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
c760: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
c770: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
c780: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
c790: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
c7a0: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
c7b0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
c7c0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
c7d0: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
c7e0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
c7f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
c800: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
c810: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
c820: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
c830: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
c840: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
c850: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
c860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c870: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c880: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
c890: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
c8a0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
c8b0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
c8c0: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
c8d0: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
c8e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c8f0: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
c900: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
c910: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
c920: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
c930: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
c940: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
c950: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
c960: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
c970: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61  lite3_malloc(nMa
c980: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
c990: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
c9a0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
c9b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c9c0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
c9d0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
c9e0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
c9f0: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
ca00: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
ca10: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
ca20: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
ca30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
ca40: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ca50: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
ca60: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
ca70: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
ca80: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
ca90: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
caa0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
cab0: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
cac0: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
cad0: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
cae0: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
caf0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
cb00: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
cb10: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
cb20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
cb30: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
cb40: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
cb50: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
cb60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cb70: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
cb80: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
cb90: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
cba0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cbb0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
cbc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
cbd0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
cbe0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
cbf0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
cc00: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
cc10: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
cc20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
cc30: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
cc40: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
cc50: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
cc60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
cc80: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
cc90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
cca0: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
ccb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
ccc0: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
ccd0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
cce0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
ccf0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
cd00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cd10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
cd20: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
cd30: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
cd40: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
cd50: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
cd60: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
cd70: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
cd80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
cd90: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
cda0: 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
cdb0: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
cdc0: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
cdd0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
cde0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
cdf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
ce00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ce10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ce20: 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
ce30: 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a  al += (strlen(zJ
ce40: 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
ce50: 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
ce60: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ce70: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
ce80: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
ce90: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
cea0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
ceb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
cec0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
ced0: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
cee0: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
cef0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
cf00: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
cf10: 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
cf20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cf30: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  ...static void p
cf40: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
cf50: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
cf60: 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  r);../*.** Trunc
cf70: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
cf80: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
cf90: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
cfa0: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
cfb0: 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74  ndicated. Also t
cfc0: 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
cfd0: 65 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ed representatio
cfe0: 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a  n of the file..*
cff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
d000: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
d010: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
d020: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
d030: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
d040: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
d050: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
d060: 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  E && pPager->fd-
d070: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
d080: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d090: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d0a0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
d0b0: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
d0c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
d0d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d0e0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
d0f0: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
d100: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
d110: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
d120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d130: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
d140: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
d150: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
d160: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
d170: 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72  ze is the larger
d180: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   of the sector s
d190: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
d1a0: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
d1b0: 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65  orSize() and the
d1c0: 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74   pageSize..*/.st
d1d0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
d1e0: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
d1f0: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
d200: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
d210: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
d220: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
d230: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
d240: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
d250: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
d260: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
d270: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
d280: 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
d290: 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
d2a0: 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
d2b0: 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
d2c0: 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
d2d0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
d2e0: 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
d2f0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
d300: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
d310: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
d320: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
d330: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
d340: 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72  ectorSize<pPager
d350: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
d360: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
d370: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
d380: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
d390: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
d3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
d3b0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
d3c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
d3d0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
d3e0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
d3f0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
d400: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
d410: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d420: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
d430: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
d440: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
d450: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
d460: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
d470: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
d480: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
d490: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d4a0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
d4b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
d4c0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
d4d0: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
d4e0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
d4f0: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
d500: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
d510: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
d520: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
d530: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
d540: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
d550: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
d560: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
d570: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
d580: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
d590: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
d5a0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
d5b0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
d5c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
d5d0: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
d5e0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
d5f0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
d600: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
d610: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
d620: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
d630: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
d640: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
d650: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
d660: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
d670: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
d680: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
d690: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
d6a0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
d6b0: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
d6c0: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
d6d0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
d6e0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
d6f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
d700: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
d710: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
d720: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
d730: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
d740: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
d750: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
d760: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
d770: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
d780: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
d790: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
d7a0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
d7b0: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
d7c0: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
d7d0: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
d7e0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
d7f0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
d800: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
d810: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
d820: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
d830: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
d840: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
d850: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
d860: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
d870: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
d880: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
d890: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
d8a0: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
d8b0: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
d8c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
d8d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
d8e0: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
d8f0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
d900: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
d910: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
d920: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
d930: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
d940: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
d950: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
d960: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
d970: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
d980: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
d990: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
d9a0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
d9b0: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
d9c0: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
d9d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
d9e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
d9f0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
da00: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
da10: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
da20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
da30: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
da40: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
da50: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
da60: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
da70: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
da80: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
da90: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
daa0: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
dab0: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
dac0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
dad0: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
dae0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
daf0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
db00: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
db10: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
db20: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
db30: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
db40: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
db50: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
db60: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
db70: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
db80: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
db90: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
dba0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
dbb0: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
dbc0: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
dbd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
dbe0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
dbf0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
dc00: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
dc10: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
dc20: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
dc30: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
dc40: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
dc50: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
dc60: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
dc70: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
dc80: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
dc90: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
dca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dcb0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
dcc0: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
dcd0: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
dce0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
dcf0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
dd00: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
dd10: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
dd20: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
dd30: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
dd40: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
dd50: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
dd60: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
dd70: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
dd80: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
dd90: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
dda0: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
ddb0: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
ddc0: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
ddd0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
dde0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
ddf0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
de00: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
de10: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
de20: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
de30: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
de40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
de50: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
de60: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
de70: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
de80: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
de90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
dea0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
deb0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
dec0: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dee0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
def0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
df00: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df20: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
df30: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
df40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
df50: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
df60: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
df70: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
dfa0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
dfb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
dfc0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
dfd0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
dfe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
dff0: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
e000: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
e010: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
e020: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
e030: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
e040: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
e050: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
e060: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
e070: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
e080: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
e090: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
e0a0: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
e0b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
e0c0: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
e0d0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
e0e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
e0f0: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
e100: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
e110: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
e120: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
e130: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
e140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
e150: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
e160: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
e170: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
e180: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
e190: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
e1a0: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
e1b0: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
e1c0: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
e1d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
e1e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
e1f0: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
e200: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
e210: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e220: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e230: 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d  TE_OK .   || (zM
e240: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
e250: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
e260: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
e270: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29 20  ACCESS_EXISTS)) 
e280: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
e290: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
e2a0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
e2b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e2c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
e2d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
e2e0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
e2f0: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
e300: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
e310: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
e320: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
e330: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
e340: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
e350: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
e360: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
e370: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e380: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
e390: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
e3a0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
e3b0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
e3c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
e3d0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
e3e0: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
e3f0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
e400: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e410: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
e420: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
e430: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
e440: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
e450: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
e460: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
e470: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
e480: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
e490: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
e4a0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
e4b0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
e4c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
e4d0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
e4e0: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
e4f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
e500: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
e510: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
e520: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e530: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
e540: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
e550: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
e560: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
e570: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
e580: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
e590: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
e5a0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
e5b0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
e5c0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
e5d0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
e5e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
e5f0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
e600: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
e610: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
e620: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
e630: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
e640: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
e650: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
e660: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
e670: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
e680: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
e690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
e6a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
e6b0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
e6c0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
e6d0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
e6e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e6f0: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
e700: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
e710: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
e720: 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
e730: 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
e740: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
e750: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
e760: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
e770: 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
e780: 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
e790: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
e7a0: 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
e7b0: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
e7c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e7d0: 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
e7e0: 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
e7f0: 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
e800: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
e810: 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
e820: 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
e830: 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
e840: 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
e850: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
e860: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
e870: 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
e880: 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
e890: 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
e8a0: 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
e8b0: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
e8c0: 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
e8d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
e8e0: 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
e8f0: 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
e900: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
e910: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
e920: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
e930: 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
e940: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
e950: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
e960: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
e970: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
e980: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e990: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
e9a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
e9b0: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
e9c0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
e9d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
e9e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e9f0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
ea00: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
ea10: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ea20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
ea30: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
ea40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ea50: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
ea60: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ea70: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
ea80: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
ea90: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
eaa0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
eab0: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
eac0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
ead0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
eae0: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
eaf0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
eb00: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
eb10: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
eb20: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
eb30: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
eb40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eb50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
eb60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
eb70: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
eb80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
eb90: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
eba0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
ebb0: 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
ebc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
ebd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
ebe0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
ebf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ec00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
ec10: 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
ec20: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
ec30: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
ec40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ec50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
ec60: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
ec70: 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
ec80: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
ec90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
eca0: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
ecb0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
ecc0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
ecd0: 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
ece0: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
ecf0: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
ed00: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
ed10: 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
ed20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ed30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
ed40: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
ed50: 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
ed60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ed70: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
ed80: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
ed90: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
eda0: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
edb0: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
edc0: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
edd0: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
ede0: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
edf0: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
ee00: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
ee10: 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
ee20: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
ee30: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
ee40: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
ee50: 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
ee60: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
ee70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ee80: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
ee90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
eea0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
eeb0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
eec0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
eed0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
eee0: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
eef0: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
ef00: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
ef10: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
ef20: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
ef30: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
ef40: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
ef50: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
ef60: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
ef70: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
ef80: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
ef90: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
efa0: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
efb0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
efc0: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
efd0: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
efe0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
eff0: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
f000: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
f010: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
f020: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
f030: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
f040: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
f050: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
f060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
f070: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
f080: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
f090: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f0b0: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
f0c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
f0d0: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
f0e0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
f0f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f100: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
f110: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f120: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
f130: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
f140: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
f150: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
f160: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
f170: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
f180: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
f190: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
f1a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
f1b0: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
f1c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
f1d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
f1e0: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
f1f0: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
f200: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
f210: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
f220: 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
f230: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
f240: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
f250: 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
f260: 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
f270: 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
f280: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
f290: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
f2a0: 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
f2b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
f2c0: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
f2d0: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
f2e0: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
f2f0: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
f300: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
f310: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f320: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
f330: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
f340: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
f350: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
f360: 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
f370: 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
f380: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
f390: 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
f3a0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
f3b0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
f3c0: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
f3d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
f3e0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
f3f0: 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
f400: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
f410: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
f420: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
f430: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
f440: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
f450: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
f460: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
f470: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
f480: 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
f490: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
f4a0: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
f4b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
f4c0: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
f4d0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
f4e0: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
f4f0: 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
f500: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
f510: 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
f520: 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
f530: 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
f540: 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
f550: 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
f560: 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
f570: 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
f580: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
f590: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
f5a0: 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
f5b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f5c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
f5d0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
f5e0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
f5f0: 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
f600: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
f610: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f620: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
f630: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f640: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
f650: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
f660: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
f670: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
f680: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
f690: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
f6a0: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
f6b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
f6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
f6d0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
f6e0: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
f6f0: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
f700: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
f710: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
f720: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
f730: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
f740: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
f750: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
f760: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
f770: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
f780: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
f790: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
f7a0: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
f7b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
f7c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
f7d0: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
f7e0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f7f0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
f800: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f810: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
f820: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
f830: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
f840: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
f850: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
f860: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
f870: 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
f880: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
f890: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
f8a0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
f8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8c0: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
f8d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f8e0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
f8f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f900: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
f910: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
f920: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
f930: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
f940: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
f950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f960: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
f970: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
f980: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
f990: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
f9a0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
f9b0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
f9c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f9d0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f9e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
f9f0: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
fa00: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
fa10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
fa20: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
fa30: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
fa40: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
fa50: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
fa60: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
fa70: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
fa80: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
fa90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
faa0: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
fab0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
fac0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
fad0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
fae0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
faf0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
fb00: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
fb10: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
fb20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fb30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
fb40: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
fb50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
fb60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fb70: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
fb80: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
fb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fba0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
fbb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
fbc0: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
fbd0: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
fbe0: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
fbf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc00: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
fc10: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
fc20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
fc30: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
fc40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
fc50: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
fc60: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
fc70: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
fc80: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
fc90: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
fca0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
fcb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
fcc0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
fcd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
fce0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
fcf0: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
fd00: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
fd10: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
fd20: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
fd30: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
fd40: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
fd50: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
fd60: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
fd70: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
fd80: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
fd90: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
fda0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
fdb0: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
fdc0: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
fdd0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
fde0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fdf0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
fe00: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
fe10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
fe20: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
fe30: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
fe40: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
fe50: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
fe70: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
fe80: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
fe90: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
fea0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
feb0: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
fec0: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
fed0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
fee0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
fef0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
ff00: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
ff10: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
ff20: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
ff30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
ff40: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
ff50: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
ff60: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
ff70: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
ff80: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
ff90: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
ffa0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
ffb0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
ffc0: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
ffd0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
ffe0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
fff0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
10000 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
10010 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
10020 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
10030 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10040 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10050 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
10060 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
10070 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
10080 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
10090 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
100a0 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
100b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
100c0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
100d0 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
100e0 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
100f0 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
10100 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
10110 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
10120 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
10130 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
10150 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
10160 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
10170 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
10180 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
10190 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
101a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
101b0 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
101c0 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
101d0 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
101e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
101f0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
10200 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
10210 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
10220 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
10230 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
10240 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
10250 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
10260 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
10270 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
10280 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
10290 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
102a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
102b0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
102c0 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
102d0 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
102e0 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
102f0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
10300 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
10310 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
10320 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
10330 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
10340 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
10350 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
10360 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
10370 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
10380 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
10390 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
103a0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
103b0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
103c0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
103d0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
103e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
103f0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
10400 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
10410 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
10420 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
10430 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
10440 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
10450 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
10460 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
10470 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
10480 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
10490 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
104a0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
104b0 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
104c0 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
104d0 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
104e0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
104f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4e 61  ed..**.** If zNa
10500 6d 65 4f 75 74 20 69 73 20 30 2c 20 74 68 65 6e  meOut is 0, then
10510 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
10520 4a 4f 55 52 4e 41 4c 20 69 73 20 70 61 73 73 65  JOURNAL is passe
10530 64 20 74 6f 20 74 68 65 20 4f 53 20 6c 61 79 65  d to the OS laye
10540 72 2e 0a 2a 2a 20 49 66 20 7a 4e 61 6d 65 4f 75  r..** If zNameOu
10550 74 20 69 73 20 6e 6f 74 20 30 2c 20 53 51 4c 49  t is not 0, SQLI
10560 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
10570 69 73 20 70 61 73 73 65 64 2e 0a 2a 2f 0a 73 74  is passed..*/.st
10580 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
10590 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
105a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
105b0 66 73 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66  fs, .  sqlite3_f
105c0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63  ile *pFile, .  c
105d0 68 61 72 20 2a 7a 4e 61 6d 65 4f 75 74 0a 29 7b  har *zNameOut.){
105e0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a  .  int cnt = 8;.
105f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
10600 66 6c 61 67 73 20 3d 20 28 0a 20 20 20 20 20 53  flags = (.     S
10610 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
10620 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
10630 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 53 51  _CREATE|.     SQ
10640 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
10650 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
10660 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 20 20  DELETEONCLOSE.  
10670 29 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 46 72 65  );..  char *zFre
10680 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4e 61  e = 0;.  if( zNa
10690 6d 65 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  meOut==0 ){.    
106a0 7a 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  zFree = (char *)
106b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
106c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
106d0 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 72 65 65  ;.    if( !zFree
106e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
106f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10700 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 4f 75     }.    zNameOu
10710 74 20 3d 20 7a 46 72 65 65 3b 0a 20 20 20 20 66  t = zFree;.    f
10720 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
10730 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 3b 0a  PEN_SUBJOURNAL;.
10740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
10750 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
10760 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 0a  N_TEMP_DB;.  }..
10770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
10780 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
10790 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
107a0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
107b0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
107c0 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
107d0 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
107e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 47  ;.    sqlite3OsG
107f0 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66 73 2c  etTempName(pVfs,
10800 20 7a 4e 61 6d 65 4f 75 74 29 3b 0a 20 20 20 20   zNameOut);.    
10810 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
10820 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 4f 75  en(pVfs, zNameOu
10830 74 2c 20 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c  t, pFile, flags,
10840 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
10850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
10860 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  | pFile->pMethod
10870 73 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63  s );.  }while( c
10880 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
10890 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
108a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20  ITE_NOMEM );..  
108b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 72  sqlite3_free(zFr
108c0 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ee);.  return rc
108d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
108e0 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
108f0 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
10900 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
10910 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
10920 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
10930 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
10940 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
10950 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
10960 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
10970 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
10980 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
10990 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
109a0 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
109b0 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
109c0 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
109d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
109e0 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
109f0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
10a00 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
10a10 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
10a20 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
10a30 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
10a40 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
10a50 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
10a60 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
10a70 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
10a80 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
10a90 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
10aa0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
10ab0 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
10ac0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
10ad0 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
10ae0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
10af0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
10b00 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
10b10 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
10b20 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
10b30 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
10b40 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
10b50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10b60 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
10b70 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
10b80 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
10b90 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
10ba0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
10bb0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
10bc0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
10bd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
10be0 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
10bf0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
10c00 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
10c10 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c30 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
10c40 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
10c50 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
10c60 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
10c70 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
10c80 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
10c90 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
10ca0 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
10cb0 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
10cc0 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
10cd0 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
10ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10cf0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
10d00 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
10d10 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
10d20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
10d30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
10d40 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
10d50 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
10d60 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
10d70 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
10d80 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
10d90 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a  OCK)!=0;.  int j
10da0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
10db0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
10dc0 69 7a 65 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a  ize(pVfs);..  /*
10dd0 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74   The default ret
10de0 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  urn is a NULL po
10df0 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61  inter */.  *ppPa
10e00 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41  ger = 0;..  /* A
10e10 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
10e20 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
10e30 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
10e40 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
10e50 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
10e60 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
10e70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
10e80 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10e90 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
10ea0 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e +           /*
10eb0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
10ec0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a  e structure */ .
10ed0 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
10ee0 6c 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  le * 2 +        
10ef0 2f 2a 20 54 68 65 20 64 62 20 61 6e 64 20 73 74  /* The db and st
10f00 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  mt journal files
10f10 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 6d   */ .    pVfs->m
10f20 78 50 61 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20  xPathname * 3 + 
10f30 33 30 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  30   /* zFilenam
10f40 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  e, zDirectory, z
10f50 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
10f60 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b    if( !pPager ){
10f70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10f80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10f90 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
10fa0 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
10fb0 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
10fc0 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
10fd0 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
10fe0 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
10ff0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
11000 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
11010 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
11020 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
11030 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
11040 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
11050 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
11060 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
11070 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
11080 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
11090 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
110a0 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
110b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
110c0 5b 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  [pVfs->mxPathnam
110d0 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  e];.  pPager->zJ
110e0 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
110f0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 70 56 66  ->zDirectory[pVf
11100 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a  s->mxPathname];.
11110 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
11120 20 70 56 66 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65   pVfs;..  /* Ope
11130 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
11140 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61   and set zFullPa
11150 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20  thname to point 
11160 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20  at malloc()ed . 
11170 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61   ** memory conta
11180 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65  ining the comple
11190 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65  te filename (i.e
111a0 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  . including the 
111b0 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f  directory)..  */
111c0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
111d0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
111e0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
111f0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11200 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11210 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
11220 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
11230 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
11240 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
11250 6e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  name[0] = '\0';.
11260 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
11270 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
11280 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
11290 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
112a0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
112b0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
112c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
112d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
112e0 69 66 28 20 73 74 72 6c 65 6e 28 70 50 61 67 65  if( strlen(pPage
112f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3e 28 70  r->zFilename)>(p
11300 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
11310 2d 20 73 74 72 6c 65 6e 28 22 2d 6a 6f 75 72 6e  - strlen("-journ
11320 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 20  al")) ){.       
11330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
11340 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ANTOPEN;.       
11350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11360 20 20 69 6e 74 20 6f 66 6c 61 67 20 3d 20 0a 20    int oflag = . 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
11380 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11390 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
113a0 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
113b0 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 20  EN_MAIN_DB);.   
113c0 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
113d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
113e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
113f0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
11400 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
11410 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c 20 26 66  r->fd, oflag, &f
11420 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
11430 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
11440 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
11450 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20  DONLY);.        
11460 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11480 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
11490 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
114a0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
114b0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
114c0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
114d0 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
114e0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
114f0 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
11500 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
11510 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
11520 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
11530 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
11540 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
11550 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
11560 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11570 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
11580 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
11590 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
115a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
115b0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
115c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
115d0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 44 45 46  alloc(SQLITE_DEF
115e0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
115f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
11600 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
11610 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
11620 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
11630 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20  ee the memory . 
11640 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
11650 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y zFullPathname,
11660 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20   free the Pager 
11670 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
11680 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  ose the .  ** fi
11690 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  le. Since the pa
116a0 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
116b0 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
116c0 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
116d0 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
116e0 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
116f0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
11700 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  er || !pPager->p
11710 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
11720 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11730 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
11740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
11750 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
11760 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
11770 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
11780 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
11790 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
117a0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
117b0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
117c0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
117d0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
117e0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
117f0 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  er, zFullPathnam
11800 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
11810 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
11820 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
11830 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
11840 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
11850 6c 65 6e 61 6d 65 2c 20 70 56 66 73 2d 3e 6d 78  lename, pVfs->mx
11860 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Pathname);.  for
11870 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72  (i=strlen(pPager
11880 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69  ->zDirectory); i
11890 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
118a0 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
118b0 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
118c0 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
118d0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
118e0 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
118f0 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
11900 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
11910 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
11920 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
11930 6d 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  me, pVfs->mxPath
11940 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
11950 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
11960 6c 5b 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d  l[strlen(pPager-
11970 3e 7a 4a 6f 75 72 6e 61 6c 29 5d 2c 20 22 2d 6a  >zJournal)], "-j
11980 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20  ournal", 9);..  
11990 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
119a0 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
119b0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
119c0 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
119d0 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
119e0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
119f0 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
11a00 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
11a10 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11a20 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
11a30 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
11a40 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
11a50 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
11a60 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
11a70 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
11a80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11a90 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
11aa0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
11ab0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
11ac0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
11ad0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
11ae0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
11af0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
11b00 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
11b10 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
11b20 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
11b30 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
11b40 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28  COUNT;.  assert(
11b50 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
11b60 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
11b70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
11b80 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
11b90 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
11ba0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11bb0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
11bc0 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
11bd0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
11be0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
11bf0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
11c00 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
11c10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
11c20 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
11c30 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
11c40 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
11c50 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
11c60 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
11c70 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
11c80 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
11c90 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
11ca0 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
11cb0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
11cc0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
11cd0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
11ce0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
11cf0 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
11d00 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
11d10 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
11d20 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
11d30 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
11d40 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
11d50 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20  NC_NORMAL;.  /* 
11d60 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11d70 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11d80 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11d90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
11da0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
11db0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
11dc0 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
11dd0 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
11de0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
11df0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d  >fd->pMethods||m
11e00 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b  emDb||tempFile);
11e10 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
11e20 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69  .    setSectorSi
11e30 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
11e40 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
11e50 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
11e60 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
11e70 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
11e80 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
11e90 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
11ea0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
11eb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11ec0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
11ed0 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d  GEMENT.  pPager-
11ee0 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
11ef0 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44   pPager->iInUseD
11f00 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65  B = 0;.  if( !me
11f10 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
11f20 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20  e3_mutex *mutex 
11f30 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
11f40 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
11f50 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
11f60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
11f70 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
11f80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  .    pPager->pNe
11f90 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  xt = sqlite3Page
11fa0 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  rList;.    if( s
11fb0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
11fc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
11fe0 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20  t->pPrev==0 );. 
11ff0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12000 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  rList->pPrev = p
12010 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Pager;.    }.   
12020 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d   pPager->pPrev =
12030 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
12040 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
12050 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  r;.    sqlite3_m
12060 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
12070 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
120a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
120b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
120c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
120d0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
120e0 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
120f0 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
12100 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
12110 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
12120 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
12130 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
12140 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
12150 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
12160 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
12170 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
12180 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
12190 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
121a0 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
121b0 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
121c0 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
121d0 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
121e0 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
121f0 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
12200 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
12210 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
12220 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
12230 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
12240 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
12250 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
12260 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
12270 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
12280 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
12290 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
122a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
122b0 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
122c0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
122d0 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
122e0 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
122f0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
12300 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
12310 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
12320 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
12330 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
12340 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
12350 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
12360 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
12370 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
12380 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
12390 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
123a0 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
123b0 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
123c0 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
123d0 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
123e0 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
123f0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
12400 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
12410 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
12420 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
12430 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
12440 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
12450 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
12460 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
12470 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
12480 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
12490 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
124a0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
124b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
124c0 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
124d0 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
124e0 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
124f0 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
12500 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
12510 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
12520 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
12530 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
12540 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
12550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12560 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
12570 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12580 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
12590 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
125a0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
125b0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
125c0 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
125d0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
125e0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
125f0 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 45  =0 ){.    pagerE
12600 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
12610 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12620 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12630 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
12640 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65  geSize;.    page
12650 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
12660 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12670 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
12680 63 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ce);.    pPager-
12690 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
126a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
126b0 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
126c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
126d0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Size;.}../*.** A
126e0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
126f0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
12700 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
12710 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
12720 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
12730 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
12740 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
12750 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
12760 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
12770 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
12780 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
12790 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
127a0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
127b0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
127c0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
127d0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
127e0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
127f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12800 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
12810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12820 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
12830 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
12840 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
12850 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
12860 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12870 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
12880 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
12890 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
128a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
128b0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
128c0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
128d0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
128e0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
128f0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
12900 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
12910 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
12920 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
12930 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
12940 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
12950 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
12960 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
12970 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
12980 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
12990 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
129a0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
129b0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
129c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
129d0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
129e0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
129f0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
12a00 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
12a10 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
12a20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
12a30 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
12a40 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
12a50 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
12a60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
12a70 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
12a80 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
12a90 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
12aa0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
12ab0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
12ac0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
12ad0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
12ae0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
12af0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
12b00 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12b10 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
12b20 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
12b30 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12b40 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12b50 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
12b60 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
12b70 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
12b80 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
12b90 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
12ba0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
12bb0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
12bc0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
12bd0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
12be0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
12bf0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
12c00 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
12c10 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
12c20 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
12c30 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
12c40 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
12c50 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
12c60 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
12c70 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
12c80 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
12c90 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
12ca0 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
12cb0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
12cc0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
12cd0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
12ce0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
12cf0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
12d00 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
12d10 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
12d20 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
12d30 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
12d40 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
12d50 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
12d60 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
12d70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12d80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
12d90 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
12da0 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c    assert(MEMDB||
12db0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
12dc0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
12dd0 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  mpFile);.  if( p
12de0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
12df0 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ods ){.    IOTRA
12e00 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
12e10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
12e20 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
12e30 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
12e40 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
12e50 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
12e60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
12e70 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
12e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12ea0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12eb0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
12ec0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
12ed0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
12ee0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
12ef0 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
12f00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
12f10 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
12f20 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
12f30 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
12f40 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
12f50 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
12f60 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
12f70 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
12f80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
12f90 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
12fa0 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
12fb0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
12fc0 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
12fd0 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
12fe0 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
12ff0 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
13000 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
13010 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
13020 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
13030 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
13040 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   n = 0;.  int rc
13050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13060 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
13070 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
13080 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
13090 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
130a0 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
130b0 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
130c0 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
130d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
130e0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
130f0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
13100 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
13110 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
13120 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
13130 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
13140 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
13150 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
13160 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
13170 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
13180 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13190 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
131a0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
131b0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
131c0 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
131d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
131e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
131f0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13200 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
13210 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
13220 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
13230 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
13240 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
13250 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
13260 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
13270 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
13280 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
13290 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
132a0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
132b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
132c0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
132d0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
132e0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
132f0 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
13300 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
13310 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
13320 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
13330 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
13340 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
13350 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
13360 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
13370 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
13380 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
13390 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
133a0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
133b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
133c0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
133d0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
133e0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
133f0 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
13400 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
13410 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
13420 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
13430 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
13440 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
13450 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
13460 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
13470 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
13480 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
13490 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
134a0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
134b0 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
134c0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
134d0 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
134e0 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
134f0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
13500 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
13510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13520 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
13530 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13540 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
13550 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
13560 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13570 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
13580 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
13590 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
135a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
135b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
135c0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
135d0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
135e0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
135f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
13600 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
13610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13620 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
13630 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
13640 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
13650 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
13660 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
13670 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
13680 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
13690 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
136a0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
136b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
136c0 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
136d0 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
136e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
136f0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
13700 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
13710 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
13720 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
13730 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
13740 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
13750 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
13760 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
13770 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
13780 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
13790 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
137a0 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
137b0 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
137c0 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
137d0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
137e0 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
137f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
13800 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13810 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65  ;..  /* Keep the
13820 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f   pFirstSynced po
13830 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61  inter pointing a
13840 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63  t the first sync
13850 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f  hronized page */
13860 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67  .  if( pPg==pPag
13870 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
13880 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13890 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
138a0 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  e;.    while( p 
138b0 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
138c0 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
138d0 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72  ee; }.    pPager
138e0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
138f0 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   p;.  }..  /* Un
13900 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72  link from the fr
13910 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20  eelist */.  if( 
13920 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
13930 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  {.    pPg->pPrev
13940 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
13950 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
13960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
13970 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
13980 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  First==pPg );.  
13990 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
139a0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
139b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  e;.  }.  if( pPg
139c0 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
139d0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
139e0 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
139f0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
13a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
13a10 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  rt( pPager->pLas
13a20 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
13a30 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
13a40 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
13a50 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  }.  pPg->pNextFr
13a60 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
13a70 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55  ree = 0;..  /* U
13a80 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
13a90 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
13aa0 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
13ab0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
13ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13ad0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13ae0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
13af0 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
13b00 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
13b10 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
13b20 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
13b30 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
13b40 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
13b50 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
13b60 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
13b70 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
13b80 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
13b90 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
13ba0 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
13bb0 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
13bc0 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
13bd0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
13be0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
13bf0 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
13c00 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
13c10 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
13c20 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
13c30 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
13c40 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
13c50 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
13c60 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
13c70 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
13c80 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
13c90 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
13ca0 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
13cb0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
13cc0 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
13cd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
13ce0 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
13cf0 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
13d00 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
13d10 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
13d20 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
13d30 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
13d40 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
13d50 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
13d60 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
13d70 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
13d80 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
13d90 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
13da0 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
13db0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
13dc0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
13dd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
13de0 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
13df0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
13e00 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
13e10 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
13e20 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
13e30 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
13e40 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
13e50 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
13e60 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
13e70 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
13e80 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
13e90 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
13ea0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
13eb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13ec0 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
13ed0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
13ee0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
13ef0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
13f00 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
13f10 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
13f20 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
13f30 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
13f40 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
13f50 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
13f60 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
13f70 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
13f80 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
13f90 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
13fa0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
13fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13fc0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
13fd0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
13fe0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
13ff0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
14000 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
14010 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
14020 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14030 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
14040 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
14050 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
14060 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
14070 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
14080 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
14090 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
140a0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
140b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
140c0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
140d0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
140e0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
140f0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
14100 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
14110 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
14120 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
14130 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
14140 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
14150 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
14160 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
14170 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
14180 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
14190 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
141a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
141b0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
141c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
141d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
141e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
141f0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
14200 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
14210 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
14220 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14230 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
14240 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
14250 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
14260 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14280 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
14290 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
142a0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
142b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
142c0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
142d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
142e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
142f0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
14300 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
14310 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
14320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14330 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
14340 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
14350 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
14360 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
14370 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
14380 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
14390 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
143a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
143b0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
143c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
143d0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
143e0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
143f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
14400 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
14410 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
14420 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
14430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14440 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
14450 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
14460 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
14470 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
14480 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
14490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
144a0 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  K;.  }.  pagerEn
144b0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
144c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
144d0 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
144e0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
144f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14500 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
14510 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
14520 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
14530 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14540 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
14550 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67  cating. */.  pag
14560 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
14570 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
14580 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
14590 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
145a0 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  K);.  pagerLeave
145b0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
145c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
145d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
145e0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
145f0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
14600 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
14610 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14620 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
14630 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
14640 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
14650 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
14660 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
14670 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
14680 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
14690 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
146a0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
146b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
146c0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
146d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
146e0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
146f0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
14700 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
14710 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
14720 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
14730 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
14740 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
14750 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
14760 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
14770 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
14780 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
14790 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
147a0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
147b0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
147c0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
147d0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
147e0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
147f0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
14800 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
14810 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
14820 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
14830 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
14840 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
14850 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
14860 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
14870 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
14880 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
14890 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
148a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
148b0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
148c0 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44  MENT.  if( !MEMD
148d0 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
148e0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
148f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
14900 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14910 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
14920 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14930 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
14940 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
14950 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50  Prev ){.      pP
14960 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  ager->pPrev->pNe
14970 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
14980 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
14990 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
149a0 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e  rList = pPager->
149b0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
149c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65   if( pPager->pNe
149d0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  xt ){.      pPag
149e0 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  er->pNext->pPrev
149f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76   = pPager->pPrev
14a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14a10 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14a20 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
14a30 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
14a40 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
14a50 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
14a60 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
14a70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14a80 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
14a90 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
14aa0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
14ab0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
14ac0 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
14ad0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
14ae0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
14af0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
14b00 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
14b10 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
14b20 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
14b30 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
14b40 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
14b50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14b60 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
14b70 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
14b80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14b90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
14ba0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
14bb0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
14bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
14bd0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
14be0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
14bf0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
14c00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
14c10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
14c20 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
14c30 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
14c40 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
14c50 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
14c60 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
14c70 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
14c80 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
14c90 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
14ca0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14cb0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
14cc0 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
14cd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
14ce0 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
14cf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
14d00 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
14d10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14d20 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14d40 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
14d50 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
14d60 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
14d70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
14d80 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
14d90 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
14da0 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
14db0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
14dc0 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
14dd0 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
14de0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
14df0 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
14e00 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
14e10 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
14e20 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
14e30 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
14e40 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
14e50 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
14e60 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
14e70 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
14e80 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
14e90 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
14ea0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
14eb0 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
14ec0 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
14ed0 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
14ee0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
14ef0 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
14f00 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
14f10 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
14f20 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
14f30 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
14f40 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
14f50 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
14f60 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
14f70 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
14f80 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
14f90 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
14fa0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
14fb0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
14fc0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
14fd0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
14fe0 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
14ff0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
15000 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
15010 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
15020 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
15030 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
15040 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
15050 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
15060 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
15070 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
15080 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
15090 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
150a0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
150b0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
150c0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
150d0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
150e0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
150f0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
15100 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
15110 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
15120 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
15130 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
15140 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
15150 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
15160 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
15170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15180 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
15190 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
151a0 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
151b0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
151c0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
151d0 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
151e0 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
151f0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
15200 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
15210 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
15220 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
15230 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
15240 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
15250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15260 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
15270 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
15280 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
15290 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
152a0 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
152b0 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
152c0 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
152d0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
152e0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
152f0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
15300 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
15310 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
15320 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
15330 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
15340 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
15350 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
15360 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
15370 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
15380 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  er);.  page_ref(
15390 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  pPg);.  pagerLea
153a0 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  ve(pPg->pPager);
153b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
153c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
153d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
153e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
153f0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
15400 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
15410 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
15420 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
15430 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
15440 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
15450 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
15460 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
15470 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
15480 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
15490 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
154a0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
154b0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
154c0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
154d0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
154e0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
154f0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
15500 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
15510 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
15520 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
15530 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
15540 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
15550 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
15560 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
15570 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
15580 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
15590 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
155a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
155b0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
155c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
155d0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
155e0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
155f0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
15600 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
15610 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
15620 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15630 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
15640 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
15650 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
15660 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
15670 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
15680 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
15690 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
156a0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
156b0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
156c0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
156d0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
156e0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
156f0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
15700 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
15710 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
15720 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
15730 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
15740 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
15750 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  o no sync occurs
15760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
15770 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
15780 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
15790 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
157a0 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a  edia on which.**
157b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
157c0 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73   stored, then Os
157d0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
157e0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f  called on the jo
157f0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49  urnal.** file. I
15800 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
15810 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
15820 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68   is to update th
15830 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a  e nRec field in.
15840 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
15850 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eader..**.** Thi
15860 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
15870 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
15880 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
15890 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
158a0 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
158b0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
158c0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
158d0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
158e0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
158f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
15900 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
15910 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
15920 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
15930 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
15940 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
15950 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
15960 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
15970 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
15980 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
15990 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
159a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
159b0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
159c0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
159d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
159e0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
159f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15a00 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
15a10 0a 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ..      /* asser
15a20 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
15a30 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
15a40 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
15a50 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
15a60 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
15a70 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
15a80 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
15a90 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
15aa0 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
15ab0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
15ac0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
15ad0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
15ae0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
15af0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
15b00 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
15b10 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
15b20 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
15b30 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
15b40 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
15b50 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
15b60 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
15b70 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
15b80 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
15b90 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
15ba0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
15bb0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
15bc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
15bd0 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
15be0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
15bf0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
15c00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
15c10 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
15c20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
15c30 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
15c40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
15c50 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
15c60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
15c70 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
15c80 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
15c90 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
15ca0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
15cb0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
15cc0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
15cd0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
15ce0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
15cf0 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
15d00 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
15d10 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
15d20 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
15d30 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
15d40 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
15d50 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
15d60 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
15d70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
15d80 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
15d90 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
15da0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
15db0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
15dc0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
15dd0 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
15de0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
15df0 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
15e00 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
15e10 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
15e20 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
15e30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
15e40 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
15e50 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
15e60 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
15e70 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
15e80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
15e90 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20   jrnlOff;.      
15ea0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
15eb0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
15ec0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
15ed0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
15ee0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
15ef0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
15f00 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
15f10 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
15f20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
15f30 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
15f40 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
15f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15f60 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
15f70 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
15f80 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
15f90 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
15fa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
15fb0 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f  }..        jrnlO
15fc0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
15fd0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
15fe0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
15ff0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
16000 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
16010 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a  %d\n", pPager, j
16020 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20  rnlOff, 4));.   
16030 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
16040 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
16050 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67  d, jrnlOff, pPag
16060 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
16070 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
16080 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
16090 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
160a0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
160b0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
160c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
160d0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
160e0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
160f0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
16100 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
16110 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
16120 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
16130 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
16140 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
16150 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a  r->sync_flags| .
16160 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
16170 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53  r->sync_flags==S
16180 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
16190 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
161a0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
161b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
161c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
161d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
161e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
161f0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
16200 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
16210 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
16220 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
16230 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
16240 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
16250 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
16260 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
16270 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
16280 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
16290 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
162a0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
162b0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
162c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
162d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
162e0 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
162f0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
16300 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
16310 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
16320 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
16330 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
16340 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
16350 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
16360 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
16370 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
16380 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
16390 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
163a0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
163b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
163c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
163d0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
163e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
163f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
16400 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
16410 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
16420 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
16430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
16440 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67  two lists of pag
16450 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  es connected by 
16460 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67  pDirty and in pg
16470 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20  no order..** Do 
16480 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20  not both fixing 
16490 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  the pPrevDirty p
164a0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
164b0 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f  ic PgHdr *merge_
164c0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
164d0 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a  pA, PgHdr *pB){.
164e0 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20    PgHdr result, 
164f0 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
16500 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69  = &result;.  whi
16510 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a  le( pA && pB ){.
16520 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f      if( pA->pgno
16530 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  <pB->pgno ){.   
16540 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
16550 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61   = pA;.      pTa
16560 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  il = pA;.      p
16570 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a  A = pA->pDirty;.
16580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16590 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
165a0 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pB;.      pTail
165b0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20   = pB;.      pB 
165c0 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pB->pDirty;.  
165d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41    }.  }.  if( pA
165e0 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
165f0 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65  Dirty = pA;.  }e
16600 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20  lse if( pB ){.  
16610 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
16620 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = pB;.  }else{. 
16630 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
16640 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
16650 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79  rn result.pDirty
16660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20  ;.}../*.** Sort 
16670 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
16680 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
16690 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50  rder by pgno.  P
166a0 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e  ages are.** conn
166b0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
166c0 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70  pointers.  The p
166d0 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
166e0 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70  rs are.** corrup
166f0 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74  ted by this sort
16700 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53  ..*/.#define N_S
16710 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
16720 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f   25.#define N_SO
16730 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20  RT_BUCKET       
16740 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  25.#ifdef SQLITE
16750 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69  _TEST.  int sqli
16760 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
16770 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23  _bucket = 0;.  #
16780 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43  undef N_SORT_BUC
16790 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f  KET.  #define N_
167a0 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20  SORT_BUCKET \.  
167b0 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   (sqlite3_pager_
167c0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71  n_sort_bucket?sq
167d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
167e0 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54  rt_bucket:N_SORT
167f0 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23  _BUCKET_ALLOC).#
16800 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48  endif.static PgH
16810 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73  dr *sort_pagelis
16820 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20  t(PgHdr *pIn){. 
16830 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54   PgHdr *a[N_SORT
16840 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20  _BUCKET_ALLOC], 
16850 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d  *p;.  int i;.  m
16860 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
16870 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28  of(a));.  while(
16880 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20   pIn ){.    p = 
16890 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  pIn;.    pIn = p
168a0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
168b0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
168c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f   for(i=0; i<N_SO
168d0 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b  RT_BUCKET-1; i++
168e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ){.      if( a[i
168f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
16900 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  a[i] = p;.      
16910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
16930 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
16940 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
16950 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
16960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16970 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43  f( i==N_SORT_BUC
16980 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f  KET-1 ){.      /
16990 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67  * Coverage: To g
169a0 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e  et here, there n
169b0 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53  eed to be 2^(N_S
169c0 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20  ORT_BUCKET) .   
169d0 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69     ** elements i
169e0 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74  n the input list
169f0 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62  . This is possib
16a00 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69  le, but impracti
16a10 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65  cal..      ** Te
16a20 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20  sting this line 
16a30 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  is the point of 
16a40 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a  global variable.
16a50 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
16a60 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
16a70 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cket..      */. 
16a80 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67       a[i] = merg
16a90 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
16aa0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   p);.    }.  }. 
16ab0 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72   p = a[0];.  for
16ac0 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=1; i<N_SORT_B
16ad0 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  UCKET; i++){.   
16ae0 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
16af0 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20  ist(p, a[i]);.  
16b00 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
16b10 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
16b20 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
16b30 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
16b40 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
16b50 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
16b60 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
16b70 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
16b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16b90 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
16ba0 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
16bb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16bc0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
16bd0 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
16be0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16bf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
16c00 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c20 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
16c30 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
16c40 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
16c50 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
16c60 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
16c70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16c80 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
16c90 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
16ca0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
16cb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
16cc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
16cd0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
16ce0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
16cf0 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
16d00 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
16d10 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
16d20 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
16d30 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
16d40 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
16d50 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
16d60 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
16d70 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
16d80 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
16d90 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
16da0 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
16db0 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
16dc0 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
16dd0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
16de0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
16df0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
16e00 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
16e10 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
16e20 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
16e30 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
16e40 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
16e50 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
16e60 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
16e70 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
16e80 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
16e90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
16ea0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
16eb0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
16ec0 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
16ed0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
16ee0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
16ef0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
16f00 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
16f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
16f20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
16f30 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
16f40 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
16f50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16f60 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
16f70 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
16f80 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
16f90 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
16fa0 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
16fb0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
16fc0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
16fd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
16fe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17000 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
17010 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
17020 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68  ist(pList);.  wh
17030 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
17040 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
17050 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
17060 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
17070 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
17080 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
17090 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
170a0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
170b0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
170c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
170d0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
170e0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
170f0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ->fd, pPager->zF
17100 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
17110 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17120 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  rc;.    }..    a
17130 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
17140 72 74 79 20 29 3b 0a 20 20 20 20 2f 2a 20 49 66  rty );.    /* If
17150 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
17160 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
17170 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
17180 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
17190 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
171a0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
171b0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
171c0 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
171d0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
171e0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
171f0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
17200 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
17210 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
17220 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
17230 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
17240 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
17250 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
17260 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
17270 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
17280 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c  i64 offset = (pL
17290 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
172a0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
172b0 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ze;.      char *
172c0 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
172d0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
172e0 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
172f0 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
17300 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
17310 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
17320 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
17330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17340 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17350 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
17360 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
17370 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20  (pList));.      
17380 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
17390 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
173a0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b  , pList->pgno));
173b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
173c0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
173d0 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
173e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
173f0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50  offset);.      P
17400 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
17410 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
17420 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
17430 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
17440 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  >nWrite);.      
17450 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
17460 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
17470 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
17480 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
17490 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
174a0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
174b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
174c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
174d0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
174e0 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53  PAGERTRACE3("NOS
174f0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
17500 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17510 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
17520 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
17530 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
17540 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
17550 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  t->dirty = 0;.#i
17560 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
17570 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
17580 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
17590 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
175a0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
175b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
175c0 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
175d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
175e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
175f0 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
17600 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
17610 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
17620 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17630 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
17640 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
17650 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
17660 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
17670 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
17680 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
17690 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
176a0 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
176b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
176c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
176d0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
176e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72  urn TRUE if ther
176f0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
17700 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  al on the given 
17710 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20  pager..** A hot 
17720 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
17730 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
17740 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  played back..**.
17750 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
17760 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
17770 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
17780 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
17790 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
177a0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
177b0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
177c0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
177d0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
177e0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
177f0 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65  name.  Just dele
17800 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
17810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
17820 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
17830 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
17840 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
17850 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
17860 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
17870 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
17880 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
17890 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
178a0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
178b0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
178c0 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20  SS_EXISTS) ){.  
178d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
178e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
178f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
17900 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
17910 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17920 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  }.  if( sqlite3P
17930 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17940 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
17950 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17960 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
17970 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
17980 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
17990 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
179a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
179b0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
179c0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
179d0 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
179e0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
179f0 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
17a00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
17a10 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
17a20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
17a30 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
17a40 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  he pPager->errCo
17a50 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  de variable..*/.
17a60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17a70 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
17a80 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
17a90 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
17aa0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
17ab0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
17ac0 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b   assert(!MEMDB);
17ad0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
17ae0 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
17af0 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
17b00 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
17b10 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
17b20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
17b30 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
17b40 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
17b50 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
17b60 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  ynced;..  /* If 
17b70 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
17b80 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
17b90 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
17ba0 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f  n fsync().  ** o
17bb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
17bc0 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
17bd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
17be0 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20   This is a.  ** 
17bf0 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
17c00 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
17c10 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
17c20 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
17c30 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62  .  ** it can't b
17c40 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20  e helped..  */. 
17c50 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70   if( pPg==0 && p
17c60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26  Pager->pFirst &&
17c70 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44   syncOk && !MEMD
17c80 42 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20  B){.    int iDc 
17c90 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
17ca0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
17cb0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
17cc0 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
17cd0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
17ce0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
17cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17d10 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
17d20 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
17d30 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
17d40 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 2f  PEND) ){.      /
17d50 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
17d60 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
17d70 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
17d80 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  er into the.    
17d90 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
17da0 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
17db0 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
17dc0 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
17dd0 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65  l.      ** heade
17de0 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
17df0 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
17e00 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
17e10 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61   have.      ** a
17e20 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
17e30 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
17e40 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65  ase (in case the
17e50 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20   header is.     
17e60 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
17e70 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
17e80 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
17e90 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
17ea0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
17eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
17ed0 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
17ee0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17ef0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
17f00 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
17f10 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
17f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
17f30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17f40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17f50 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50    }.    pPg = pP
17f60 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
17f70 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
17f80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17f90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
17fa0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
17fb0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
17fc0 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
17fd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17fe0 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
17ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
18000 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e  >dirty ){.    in
18010 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
18020 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
18030 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  =0 );.    makeCl
18040 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
18050 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
18060 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
18070 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
18080 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
18090 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
180a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
180b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
180c0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
180d0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
180e0 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
180f0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
18100 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
18110 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
18120 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
18130 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
18140 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
18150 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
18160 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
18170 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
18180 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
18190 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
181a0 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
181b0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
181c0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
181d0 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
181e0 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
181f0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
18200 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
18210 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
18220 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
18230 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
18240 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
18250 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
18260 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
18270 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
18280 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
18290 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
182a0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
182b0 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
182c0 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
182d0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
182e0 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
182f0 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
18300 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
18310 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
18320 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
18330 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
18340 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
18350 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
18360 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
18370 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
18380 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
18390 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
183a0 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70  pgno==0 );..  *p
183b0 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
183c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
183d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
183e0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
183f0 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54  NAGEMENT./*.** T
18400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18410 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
18420 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
18430 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
18440 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
18450 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
18460 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
18470 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
18480 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
18490 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
184a0 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
184b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65   sqlite3_free()e
184c0 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
184d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
184e0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
184f0 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
18500 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
18510 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
18520 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
18530 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ns. The return v
18540 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61  alue is the tota
18550 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20  l number .** of 
18560 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
18570 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74  released..*/.int
18580 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c   sqlite3PagerRel
18590 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e  easeMemory(int n
185a0 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c  Req){.  int nRel
185b0 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20  eased = 0;      
185c0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
185d0 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 20  memory released 
185e0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c 69  so far */.  sqli
185f0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
18600 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d  ;       /* The M
18610 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20 50  EM2 mutex */.  P
18620 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
18630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18640 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
18650 61 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  agers */.  int i
18660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18670 20 20 20 20 20 20 20 2f 2a 20 50 61 73 73 65 73         /* Passes
18680 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a   over pagers */.
18690 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
186a0 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  e memory-managem
186b0 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20  ent mutex.  */. 
186c0 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
186d0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
186e0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
186f0 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65  _MEM2);.  sqlite
18700 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
18710 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
18720 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
18730 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
18740 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
18750 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
18760 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
18770 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
18780 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
18790 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
187a0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
187b0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
187c0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
187d0 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
187e0 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
187f0 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
18800 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
18810 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
18820 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
18830 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
18840 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
18850 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
18860 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
18870 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
18880 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
18890 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
188a0 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
188b0 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
188c0 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
188d0 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
188e0 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
188f0 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
18900 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
18910 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
18920 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
18930 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
18940 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
18950 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
18960 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
18970 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
18980 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
18990 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  = sqlite3PagerLi
189a0 73 74 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 70  st;.    for( ; p
189b0 50 61 67 65 72 20 26 26 20 28 6e 52 65 71 3c 30  Pager && (nReq<0
189c0 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
189d0 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50 61 67  eq); pPager=pPag
189e0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
189f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18a00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
18a10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 20 20 2f  ITE_OK;..      /
18a20 2a 20 49 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * In-memory data
18a30 62 61 73 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74  bases should not
18a40 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 70   appear on the p
18a50 61 67 65 72 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ager list */.   
18a60 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
18a70 42 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  B );..      /* S
18a80 6b 69 70 20 70 61 67 65 72 73 20 74 68 61 74 20  kip pagers that 
18a90 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
18aa0 20 75 73 65 20 62 79 20 74 68 65 20 62 2d 74 72   use by the b-tr
18ab0 65 65 20 6c 61 79 65 72 20 2a 2f 0a 20 20 20 20  ee layer */.    
18ac0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 69 49    if( pPager->iI
18ad0 6e 55 73 65 44 42 20 29 20 63 6f 6e 74 69 6e 75  nUseDB ) continu
18ae0 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72  e;..      /* For
18af0 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
18b00 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
18b10 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
18b20 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
18b30 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
18b40 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
18b50 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
18b60 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
18b70 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
18b80 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
18b90 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 6e 52        while( (nR
18ba0 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
18bb0 64 3c 6e 52 65 71 29 20 26 26 0a 20 20 20 20 20  d<nReq) &&.     
18bc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18bd0 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72  K==(rc = pager_r
18be0 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 69  ecycle(pPager, i
18bf0 2c 20 26 70 50 67 29 29 20 26 26 0a 20 20 20 20  , &pPg)) &&.    
18c00 20 20 20 20 20 20 20 20 20 70 50 67 0a 20 20 20           pPg.   
18c10 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 2f     ) {.        /
18c20 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
18c30 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
18c40 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
18c50 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
18c60 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
18c70 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
18c80 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
18c90 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
18ca0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
18cb0 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
18cc0 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
18cd0 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
18ce0 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
18cf0 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
18d00 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
18d10 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
18d20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
18d30 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
18d40 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
18d50 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
18d60 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
18d70 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
18d80 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
18d90 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
18da0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
18db0 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
18dc0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
18dd0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
18de0 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
18df0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
18e00 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
18e10 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  All;.        }el
18e20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
18e30 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e  r( pTmp=pPager->
18e40 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
18e50 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
18e60 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
18e70 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
18e80 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
18e90 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
18ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
18eb0 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20  Released += (.  
18ec0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
18ed0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
18ee0 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
18ef0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
18f00 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
18f10 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
18f20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
18f30 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20  PgHistory) .    
18f40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 49      );.        I
18f50 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
18f60 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67  %p %d *\n", pPag
18f70 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
18f80 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
18f90 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
18fa0 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
18fb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18fc0 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
18fd0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
18fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ff0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
19000 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
19010 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
19020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19030 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  or .        ** j
19040 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f  ournal in pager_
19050 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65  recycle(). The e
19060 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
19070 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  rned to the .   
19080 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f       ** caller o
19090 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
190a0 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68   Instead, set th
190b0 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
190c0 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20  variable..      
190d0 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77    ** The error w
190e0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
190f0 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20  to the user (or 
19100 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61  users, in the ca
19110 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  se .        ** o
19120 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72  f a shared pager
19130 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70   cache) of the p
19140 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  ager for which t
19150 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  he error occured
19160 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19170 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20       assert(.   
19180 20 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66           (rc&0xf
19190 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
191a0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
191b0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
191c0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ||.            r
191d0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20  c==SQLITE_BUSY. 
191e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
191f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19200 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
19210 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
19220 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
19230 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
19240 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19250 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65   /* Clear the me
19260 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
19270 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73  flags and releas
19280 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f  e the mutex.  */
19290 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
192a0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
192b0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
192c0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
192d0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
192e0 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  seMM = 0;.  }.  
192f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19300 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  ave(mutex);..  /
19310 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
19320 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c  ber of bytes rel
19330 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74  eased.  */.  ret
19340 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
19350 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19360 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
19370 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
19380 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
19390 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
193a0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
193b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
193c0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
193d0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
193e0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
193f0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
19400 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
19410 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
19420 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
19430 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
19440 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
19450 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
19460 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
19470 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
19480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19490 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
194a0 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
194b0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
194c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
194d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
194e0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
194f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
19500 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
19510 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
19520 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
19530 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
19540 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
19550 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
19560 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
19570 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
19580 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
19590 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
195a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
195b0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
195c0 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
195d0 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
195e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
19610 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
19620 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
19630 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
19640 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19650 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
19660 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
19670 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
19680 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
19690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
196a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
196b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
196c0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
196d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
196e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
196f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19700 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
19710 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
19720 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
19730 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
19740 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
19750 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
19760 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
19770 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
19780 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
19790 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
197a0 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
197b0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
197c0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
197d0 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
197e0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
197f0 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
19800 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
19810 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
19820 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
19830 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
19840 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
19850 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
19860 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
19870 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
19880 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
19890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
198a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
198b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
198c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
198d0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
198e0 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
198f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
19900 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
19910 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
19920 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
19930 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
19940 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
19950 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
19960 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
19970 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
19980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19990 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
199a0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
199b0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
199c0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
199d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
199e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
199f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
19a00 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
19a10 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
19a20 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
19a30 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
19a40 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
19a50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
19a60 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
19a70 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
19a80 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
19a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
19aa0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
19ab0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
19ac0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
19ad0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
19ae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
19af0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
19b00 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
19b10 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
19b20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
19b30 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
19b40 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
19b50 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
19b60 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
19b70 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
19b80 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
19b90 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
19ba0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
19bb0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
19bc0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
19bd0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
19be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
19bf0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
19c00 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
19c10 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
19c20 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
19c30 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
19c40 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
19c50 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
19c60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
19c70 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
19c80 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
19c90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
19ca0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
19cb0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
19cc0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
19cd0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
19ce0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
19cf0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
19d00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19d10 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
19d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
19d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19d40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
19d50 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
19d60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19d80 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
19d90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
19da0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
19db0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
19dc0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
19dd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
19de0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
19df0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
19e00 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
19e10 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
19e20 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
19e30 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
19e40 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
19e50 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
19e60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19e70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
19e80 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
19e90 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
19ea0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
19eb0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
19ec0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
19ed0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
19ee0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
19ef0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
19f00 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
19f10 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
19f20 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
19f30 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
19f40 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
19f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
19f60 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
19f70 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
19f80 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
19f90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
19fa0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
19fb0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
19fc0 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
19fd0 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
19fe0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
19ff0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1a000 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1a010 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
1a020 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
1a030 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
1a040 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
1a050 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
1a060 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
1a070 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
1a080 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
1a090 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
1a0a0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
1a0b0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
1a0c0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
1a0d0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
1a0e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1a0f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a100 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
1a110 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  ( sqlite3OsAcces
1a120 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
1a130 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1a140 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
1a150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1a160 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
1a170 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1a180 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a190 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1a1a0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
1a1b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1a1c0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a1d0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
1a1e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a1f0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1a200 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1a210 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1a220 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1a230 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1a240 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1a250 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1a260 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1a270 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  ( fout&SQLITE_OP
1a280 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
1a290 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1a2a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1a2b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a2c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1a2d0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
1a2e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a2f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a310 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1a320 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1a330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a340 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
1a350 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a360 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1a370 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1a380 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1a390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1a3a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1a3b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1a3c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1a3d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1a3e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1a3f0 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  = 0;. .        /
1a400 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
1a410 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1a420 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
1a430 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
1a440 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
1a450 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
1a460 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
1a470 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1a480 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1a490 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
1a4a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a4b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a4c0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1a4d0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1a4e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a4f0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1a500 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1a510 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20  _SHARED || .    
1a520 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1a530 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
1a540 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
1a550 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
1a560 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1a570 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
1a580 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1a590 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1a5a0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
1a5b0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
1a5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a5d0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
1a5e0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
1a5f0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
1a600 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
1a610 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1a620 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
1a630 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
1a640 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1a650 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1a660 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
1a670 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
1a680 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1a690 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
1a6a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
1a6b0 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
1a6c0 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
1a6d0 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
1a6e0 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
1a6f0 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
1a700 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
1a710 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
1a720 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
1a730 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
1a740 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
1a750 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
1a760 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
1a770 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
1a780 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
1a790 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
1a7a0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
1a7b0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
1a7c0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
1a7d0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
1a7e0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
1a7f0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
1a800 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1a810 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
1a820 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
1a830 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
1a840 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
1a850 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
1a860 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
1a870 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
1a880 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
1a890 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
1a8a0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
1a8b0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
1a8c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
1a8d0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
1a8e0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1a8f0 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
1a900 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1a910 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1a920 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1a930 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1a940 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a950 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1a960 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
1a970 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1a980 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
1a990 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1a9a0 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
1a9b0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
1a9c0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
1a9d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a9e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1a9f0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
1aa00 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
1aa10 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
1aa20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1aa30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1aa40 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1aa50 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1aa60 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1aa70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
1aa80 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
1aa90 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1aaa0 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rs));.        }.
1aab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1aac0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
1aad0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1aae0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
1aaf0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
1ab00 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1ab10 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1ab20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ab30 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1ab40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1ab50 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
1ab60 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
1ab70 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1ab80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1ab90 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1aba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1abb0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1abc0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
1abd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1abe0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1abf0 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20  PgHdr object.   
1ac00 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20  Either create a 
1ac10 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65  new one or reuse
1ac20 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
1ac30 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  one that is not 
1ac40 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65  otherwise in use
1ac50 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67  ..**.** A new Pg
1ac60 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73  Hdr structure is
1ac70 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20   created if any 
1ac80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ac90 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a   are.** true:.**
1aca0 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
1acb0 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65  have not exceede
1acc0 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c  d our maximum al
1acd0 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69  located cache si
1ace0 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
1acf0 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52  s set by the "PR
1ad00 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22  AGMA cache_size"
1ad10 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1ad20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61      (2)  There a
1ad30 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48  re no unused PgH
1ad40 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c  dr objects avail
1ad50 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d  able at this tim
1ad60 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  e..**.**     (3)
1ad70 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d    This is an in-
1ad80 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1ad90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
1ada0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48  There are no PgH
1adb0 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  dr objects that 
1adc0 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  do not require a
1add0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1ade0 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61       file sync a
1adf0 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65  nd a sync of the
1ae00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1ae10 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
1ae20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65         prohibite
1ae30 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
1ae40 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69  se, reuse an exi
1ae50 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e  sting PgHdr.  In
1ae60 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1ae70 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69  use an.** existi
1ae80 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20  ng PgHdr if all 
1ae90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1aea0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1aeb0 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76       (1)  We hav
1aec0 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63  e reached or exc
1aed0 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75  eeded the maximu
1aee0 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  m cache size.** 
1aef0 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
1af00 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68   by "PRAGMA cach
1af10 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20  e_size"..**.**  
1af20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73     (2)  There is
1af30 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62   a PgHdr availab
1af40 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e  le with PgHdr->n
1af50 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20  Ref==0.**.**    
1af60 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74   (3)  We are not
1af70 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   in an in-memory
1af80 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
1af90 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20      (4)  Either 
1afa0 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69  there is an avai
1afb0 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74  lable PgHdr that
1afc0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a   does not need.*
1afd0 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65  *          to be
1afe0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
1aff0 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e  or else disk syn
1b000 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c  cing is currentl
1b010 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  y.**          al
1b020 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lowed..*/.static
1b030 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61   int pagerAlloca
1b040 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  tePage(Pager *pP
1b050 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70  ager, PgHdr **pp
1b060 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1b070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
1b080 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 43  dr *pPg;..  /* C
1b090 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64  reate a new PgHd
1b0a0 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  r if any of the 
1b0b0 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  four conditions 
1b0c0 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62  defined .  ** ab
1b0d0 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a  ove are met: */.
1b0e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
1b0f0 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
1b100 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  ge.   || pPager-
1b110 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  >pFirst==0 .   |
1b120 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
1b130 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
1b140 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
1b150 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29  ->doNotSync).  )
1b160 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1b170 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
1b180 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
1b190 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
1b1a0 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
1b1b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b1c0 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
1b1d0 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
1b1e0 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
1b1f0 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
1b200 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b220 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1b230 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1b240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b250 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1b260 65 72 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  er);.    pPg = s
1b270 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
1b280 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1b290 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
1b2c0 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1b2d0 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
1b300 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
1b310 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65  );.    pagerEnte
1b320 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1b330 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1b340 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b350 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1b360 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1b370 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
1b380 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
1b390 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
1b3a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1b3b0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
1b3c0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1b3d0 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
1b3e0 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
1b3f0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
1b400 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
1b410 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
1b420 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
1b430 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
1b440 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67   = pPg;.    pPag
1b450 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d  er->nPage++;.  }
1b460 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63  else{.    /* Rec
1b470 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67  ycle an existing
1b480 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72   page with a zer
1b490 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a  o ref-count. */.
1b4a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
1b4b0 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
1b4c0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1b4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1b4e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b4f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
1b500 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    i
1b510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b520 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1b530 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1b540 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
1b550 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b560 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1b570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1b580 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
1b590 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
1b5a0 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
1b5b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b5c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1b5d0 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
1b5e0 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
1b5f0 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
1b600 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
1b610 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
1b620 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
1b630 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
1b640 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
1b650 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
1b660 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
1b670 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
1b680 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
1b690 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
1b6a0 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
1b6b0 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
1b6c0 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
1b6d0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
1b6e0 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
1b6f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1b700 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
1b710 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1b720 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
1b730 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
1b740 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
1b750 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
1b760 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1b770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b780 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
1b790 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1b7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1b7b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1b7c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b7d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1b7e0 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
1b7f0 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
1b800 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
1b810 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
1b820 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
1b830 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
1b840 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
1b850 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
1b860 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1b870 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
1b880 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1b890 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
1b8a0 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
1b8b0 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
1b8c0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1b8d0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
1b8e0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1b8f0 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
1b900 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
1b910 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
1b920 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
1b930 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
1b940 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
1b950 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
1b960 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
1b970 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
1b980 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
1b990 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
1b9a0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
1b9b0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
1b9c0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
1b9d0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
1b9e0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
1b9f0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
1ba00 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
1ba10 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
1ba20 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1ba30 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1ba40 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1ba50 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
1ba60 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1ba70 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
1ba80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1ba90 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
1baa0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
1bab0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
1bac0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
1bad0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
1bae0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1baf0 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
1bb00 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
1bb10 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
1bb20 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
1bb30 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
1bb40 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
1bb50 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
1bb60 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
1bb70 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
1bb80 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
1bb90 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
1bba0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
1bbb0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
1bbc0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
1bbd0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
1bbe0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
1bbf0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
1bc00 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
1bc10 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
1bc20 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
1bc30 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
1bc40 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1bc50 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
1bc60 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1bc70 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1bc80 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
1bc90 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
1bca0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1bcb0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
1bcc0 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
1bcd0 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
1bce0 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
1bcf0 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
1bd00 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
1bd10 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
1bd20 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
1bd30 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1bd40 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
1bd50 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
1bd60 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1bd70 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
1bd80 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
1bd90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1bda0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
1bdb0 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
1bdc0 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
1bdd0 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
1bde0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
1bdf0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1be00 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
1be10 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
1be20 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
1be30 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
1be40 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1be50 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
1be60 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1be70 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1be80 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1be90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bea0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1beb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1bec0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1bed0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1bee0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1bef0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1bf00 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1bf10 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1bf20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1bf30 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1bf40 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1bf50 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1bf60 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1bf70 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bf80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bf90 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1bfa0 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
1bfb0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
1bfc0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
1bfd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1bfe0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
1bff0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
1c000 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
1c010 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1c020 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
1c030 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
1c040 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
1c050 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
1c060 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
1c070 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1c080 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1c090 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c0a0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1c0b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1c0c0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
1c0d0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
1c0e0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
1c0f0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1c100 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
1c110 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1c120 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1c130 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1c140 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
1c150 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1c170 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1c180 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
1c190 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
1c1a0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
1c1b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c1c0 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
1c1d0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
1c1e0 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
1c1f0 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
1c200 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
1c210 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
1c220 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
1c230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c240 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1c250 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1c260 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1c270 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1c280 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1c290 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1c2a0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
1c2b0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1c2c0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
1c2d0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
1c2e0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
1c2f0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
1c300 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f  nt h;.    PAGER_
1c310 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
1c320 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ss);.    rc = pa
1c330 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28  gerAllocatePage(
1c340 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
1c350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c370 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1c380 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
1c390 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
1c3a0 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f  ( !MEMDB || pgno
1c3b0 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  >pPager->stmtSiz
1c3c0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
1c3d0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1c3e0 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
1c3f0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1c400 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   ){.#if 0.      
1c410 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
1c420 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
1c430 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
1c440 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73 73  #endif.      ass
1c450 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1c460 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
1c470 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1c480 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
1c490 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
1c4a0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
1c4b0 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
1c4c0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1c4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1c4e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
1c4f0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1c500 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
1c510 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ..    makeClean(
1c520 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
1c530 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
1c540 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
1c550 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
1c560 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c570 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
1c580 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1c590 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
1c5a0 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
1c5b0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
1c5c0 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
1c5d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1c5e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1c5f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1c600 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1c610 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1c620 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50  );.      rc = pP
1c630 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c640 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c650 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
1c660 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
1c670 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
1c680 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
1c690 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
1c6a0 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
1c6b0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
1c6c0 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
1c6d0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
1c6e0 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
1c6f0 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f   || MEMDB || (no
1c700 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1c710 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1c720 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ck) ){.      if(
1c730 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
1c740 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
1c750 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c760 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1c770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c780 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
1c790 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1c7a0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
1c7b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c7c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  );.      pPg->ne
1c7d0 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65  edRead = noConte
1c7e0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
1c7f0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20  lwaysRollback;. 
1c800 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
1c810 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
1c820 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1c830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c840 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1c850 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
1c860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c870 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1c880 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1c890 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c8a0 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
1c8b0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
1c8c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1c8d0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
1c8e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1c8f0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
1c900 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ad = 0;.    }.. 
1c910 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
1c920 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1c930 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
1c940 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
1c950 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
1c960 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
1c970 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
1c980 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1c990 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1c9a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1c9b0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
1c9c0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
1c9d0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
1c9e0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
1c9f0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
1ca00 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
1ca10 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1ca20 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
1ca30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ca40 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1ca50 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1ca60 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1ca70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
1ca80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1ca90 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1caa0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1cab0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
1cac0 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  rt(pPager->nRef>
1cad0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
1cae0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1caf0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
1cb00 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
1cb10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1cb20 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1cb30 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1cb40 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1cb50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1cb60 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
1cb70 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
1cb80 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
1cb90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cba0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1cbb0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
1cbc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1cbd0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1cbe0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1cbf0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1cc00 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1cc10 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1cc20 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1cc30 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1cc40 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1cc50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1cc60 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1cc70 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1cc80 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1cc90 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1cca0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1ccb0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
1ccc0 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
1ccd0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
1cce0 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70  = pagerAcquire(p
1ccf0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50  Pager, pgno, ppP
1cd00 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
1cd10 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1cd20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1cd30 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63  rc;.}.../*.** Ac
1cd40 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1cd50 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1cd60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1cd70 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1cd80 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1cd90 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1cda0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1cdb0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1cdc0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1cdd0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1cde0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1cdf0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
1ce00 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1ce10 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
1ce20 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
1ce30 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
1ce40 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
1ce50 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
1ce60 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
1ce70 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
1ce80 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1ce90 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
1cea0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1ceb0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1cec0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1ced0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
1cee0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
1cef0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
1cf00 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
1cf10 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
1cf20 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1cf30 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1cf40 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
1cf50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1cf60 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1cf70 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
1cf80 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1cf90 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
1cfa0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1cfb0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  UNLOCK ){.    as
1cfc0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
1cfd0 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  All || pPager->e
1cfe0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
1cff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1d000 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1d010 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1d020 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1d030 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
1d040 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1d050 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  (pPg = pager_loo
1d060 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1d070 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ))!=0 ){.    pag
1d080 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
1d090 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1d0a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
1d0b0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1d0c0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1d0d0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1d0e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1d0f0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1d100 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1d110 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1d120 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1d130 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1d140 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1d150 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1d160 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1d170 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1d180 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1d190 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1d1a0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1d1b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1d1c0 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1d1d0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1d1e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1d1f0 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1d200 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1d210 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61  ->nRef>0 );.  pa
1d220 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
1d230 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  ager);.  pPg->nR
1d240 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
1d250 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
1d260 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1d270 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
1d280 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1d290 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
1d2a0 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
1d2b0 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
1d2c0 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
1d2d0 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
1d2e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
1d2f0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
1d300 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
1d310 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1d320 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
1d330 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
1d340 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
1d350 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
1d360 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
1d370 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
1d380 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
1d390 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
1d3a0 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
1d3b0 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
1d3c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1d3d0 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
1d3e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d3f0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1d400 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
1d410 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
1d420 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
1d430 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
1d440 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1d450 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1d460 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
1d470 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
1d480 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
1d490 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
1d4a0 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
1d4b0 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
1d4c0 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
1d4d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
1d4e0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
1d4f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
1d500 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1d510 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
1d520 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
1d530 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
1d540 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
1d550 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
1d560 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
1d570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1d580 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
1d590 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1d5a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1d5b0 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
1d5c0 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pPg->pPager);.
1d5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d5e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1d5f0 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
1d600 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
1d610 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
1d620 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
1d630 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
1d640 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1d650 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1d660 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d670 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
1d680 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1d690 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
1d6a0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1d6b0 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
1d6c0 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
1d6d0 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
1d6e0 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
1d6f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1d700 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
1d710 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
1d720 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1d730 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1d740 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  .  int flags = (
1d750 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1d760 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1d770 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
1d780 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
1d790 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ..  int rc;.  as
1d7a0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
1d7b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d7c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d7d0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
1d7e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1d7f0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
1d800 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d810 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1d820 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d830 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1d840 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1d850 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1d860 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
1d870 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
1d880 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1d890 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1d8a0 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
1d8b0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67  e/8 + 1 );.  pag
1d8c0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1d8d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1d8e0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
1d8f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d900 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
1d910 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1d920 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  ournal;.  }..  i
1d930 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1d940 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  ile ){.    flags
1d950 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
1d960 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
1d970 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1d980 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73  JOURNAL);.  }els
1d990 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e{.    flags |= 
1d9a0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
1d9b0 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a  N_JOURNAL);.  }.
1d9c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1d9d0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1d9e0 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  E.  rc = sqlite3
1d9f0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
1da00 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
1da10 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1da20 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
1da30 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
1da40 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65  ager).  );.#else
1da50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1da60 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1da70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1da80 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
1da90 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  , 0);.#endif.  a
1daa0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1dab0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1dac0 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1dad0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1dae0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
1daf0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
1db00 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
1db10 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
1db20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1db30 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
1db40 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1db50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1db60 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
1db70 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
1db80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
1db90 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1dba0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1dbb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1dbc0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
1dbd0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1dbe0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
1dbf0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1dc00 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1dc10 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
1dc20 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1dc30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1dc40 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
1dc50 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1dc60 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
1dc70 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1dc80 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1dc90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1dca0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1dcb0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
1dcc0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1dcd0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1dce0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
1dcf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dd00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd10 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1dd20 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1dd30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dd40 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
1dd50 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1dd60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1dd70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
1dd80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dd90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1dda0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1ddb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ddc0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
1ddd0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
1dde0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1ddf0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1de00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  al);.  pPager->a
1de10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
1de20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1de30 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
1de40 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
1de50 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1de60 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
1de70 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
1de80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1de90 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
1dea0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1deb0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1dec0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1ded0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1dee0 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
1def0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1df00 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
1df10 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1df20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1df30 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
1df40 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
1df50 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
1df60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1df70 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1df80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1df90 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
1dfa0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
1dfb0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1dfc0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
1dfd0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
1dfe0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
1dff0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
1e000 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
1e010 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1e020 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
1e030 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
1e040 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
1e050 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1e060 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1e070 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1e080 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1e090 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1e0a0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1e0b0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1e0c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1e0d0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1e0e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1e0f0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1e100 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1e110 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1e120 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1e130 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1e140 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1e150 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1e160 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1e170 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1e180 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1e190 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1e1a0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1e1b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1e1c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1e1d0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1e1e0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1e1f0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1e200 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1e210 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1e220 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1e230 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1e240 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1e250 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1e260 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1e270 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1e280 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1e290 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1e2a0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1e2b0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1e2c0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1e2d0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1e2e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1e2f0 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1e300 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1e310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1e330 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e340 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
1e350 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
1e360 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
1e370 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e380 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1e390 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
1e3a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1e3b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
1e3c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e3d0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1e3e0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
1e3f0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
1e400 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1e410 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1e420 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1e430 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e440 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
1e450 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e460 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1e470 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
1e480 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
1e490 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e4a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e4b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1e4c0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
1e4d0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
1e4e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1e4f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1e500 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
1e510 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
1e520 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e530 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e550 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1e560 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
1e570 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e580 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
1e590 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
1e5a0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
1e5b0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
1e5c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1e5d0 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
1e5e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1e5f0 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
1e600 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
1e610 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1e620 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1e630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e640 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
1e650 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1e660 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1e670 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
1e680 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
1e690 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
1e6a0 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
1e6b0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73  -access mode las
1e6c0 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
1e6d0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
1e6e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1e6f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
1e700 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
1e710 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1e720 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
1e730 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
1e740 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
1e750 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
1e760 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f  and truncated to
1e770 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f   0 bytes..    */
1e780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e790 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
1e7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e7b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
1e7c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1e7d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1e7e0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
1e7f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1e800 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1e810 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1e820 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1e830 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
1e840 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1e850 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
1e860 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61 67  8 + 1 );.    pag
1e870 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1e880 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1e890 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->aInJournal ){.
1e8a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e8b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1e8c0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
1e8d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1e8e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1e8f0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1e900 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1e910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
1e920 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1e930 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
1e940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e950 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
1e960 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c  E_OK );.  pagerL
1e970 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1e980 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e990 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1e9a0 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
1e9b0 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
1e9c0 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
1e9d0 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
1e9e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e9f0 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
1ea00 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1ea10 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
1ea20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ea30 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1ea40 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1ea50 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1ea60 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
1ea70 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
1ea80 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
1ea90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
1eaa0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1eab0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1eac0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1ead0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1eae0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
1eaf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1eb00 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
1eb10 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
1eb20 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
1eb30 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
1eb40 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
1eb50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1eb60 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
1eb70 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1eb80 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
1eb90 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
1eba0 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
1ebb0 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
1ebc0 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1ebd0 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
1ebe0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1ebf0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
1ec00 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
1ec10 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
1ec20 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
1ec30 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
1ec40 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
1ec50 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1ec60 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1ec70 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
1ec80 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
1ec90 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
1eca0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
1ecb0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1ecc0 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
1ecd0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1ece0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1ecf0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
1ed00 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
1ed10 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
1ed20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1ed30 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1ed40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1ed50 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
1ed60 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
1ed70 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
1ed80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1ed90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1eda0 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
1edb0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
1edc0 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
1edd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1ede0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
1edf0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1ee00 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
1ee10 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
1ee20 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
1ee30 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
1ee40 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
1ee50 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
1ee60 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ee70 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1ee80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
1ee90 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
1eea0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
1eeb0 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
1eec0 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
1eed0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1eee0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
1eef0 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
1ef00 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
1ef10 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
1ef20 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
1ef30 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
1ef40 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
1ef50 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
1ef60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
1ef70 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
1ef80 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1ef90 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
1efa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1efb0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
1efc0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
1efd0 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
1efe0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
1eff0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1f000 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1f010 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f020 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
1f030 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
1f040 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1f050 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
1f060 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1f070 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1f080 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
1f090 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f0a0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
1f0b0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1f0c0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
1f0d0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1f0e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1f0f0 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
1f100 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1f110 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1f120 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
1f130 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
1f140 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
1f150 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1f160 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
1f170 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
1f180 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
1f190 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
1f1a0 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
1f1b0 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
1f1c0 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
1f1d0 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
1f1e0 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
1f1f0 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
1f200 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
1f210 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
1f220 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1f230 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
1f240 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
1f250 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
1f260 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
1f270 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
1f280 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
1f290 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
1f2a0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1f2b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1f2c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f2d0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1f2e0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
1f2f0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
1f300 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1f310 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1f320 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
1f330 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
1f340 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1f350 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
1f360 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
1f370 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53  rnal && (pageInS
1f380 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
1f390 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1f3a0 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
1f3b0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1f3c0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
1f3d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
1f3e0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
1f3f0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1f400 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
1f410 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
1f420 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f430 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
1f440 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
1f450 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
1f460 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f470 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
1f480 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
1f490 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1f4a0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
1f4b0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
1f4c0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
1f4d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1f4e0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1f4f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1f500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f510 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
1f520 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f550 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1f560 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1f570 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1f580 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f590 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1f5a0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1f5b0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1f5c0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1f5d0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1f5e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f5f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f600 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1f610 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1f620 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
1f630 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1f640 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1f650 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
1f660 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
1f670 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
1f680 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
1f690 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
1f6a0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
1f6b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1f6c0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1f6d0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
1f6e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1f6f0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
1f700 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1f710 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
1f720 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1f730 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1f740 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1f750 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
1f760 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
1f770 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
1f780 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1f790 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1f7a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
1f7b0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  zPg;.        if(
1f7c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1f7d0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1f7e0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1f7f0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1f800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
1f810 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
1f820 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1f830 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f840 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1f850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1f860 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
1f870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1f880 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
1f890 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
1f8a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1f8b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1f8c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1f8d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f8e0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1f8f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1f900 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1f910 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1f920 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1f930 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1f940 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1f950 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1f960 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20  ta2, *pEnd;..   
1f970 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1f980 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1f990 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1f9a0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1f9b0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1f9c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1f9d0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1f9e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1f9f0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1fa00 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1fa10 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1fa20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1fa30 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
1fa40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
1fa50 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1fa60 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1fa70 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1fa80 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1fa90 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
1faa0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
1fab0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
1fac0 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44         pEnd = pD
1fad0 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70  ata2 + pPager->p
1fae0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
1faf0 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a     pData2 -= 4;.
1fb00 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
1fb10 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20  = *(u32*)pEnd;. 
1fb20 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
1fb30 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b  ts(pEnd, cksum);
1fb40 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
1fb50 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1fb60 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
1fb70 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1fb80 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1fb90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fba0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1fbb0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
1fbc0 20 73 7a 50 67 2c 20 70 50 61 67 65 72 2d 3e 6a   szPg, pPager->j
1fbd0 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
1fbe0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1fbf0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
1fc00 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1fc10 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1fc30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1fc40 20 73 7a 50 67 29 29 3b 0a 20 20 20 20 20 20 20   szPg));.       
1fc50 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1fc60 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1fc70 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
1fc80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1fc90 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
1fca0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1fcb0 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20  TRACE5("JOURNAL 
1fcc0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1fcd0 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
1fce0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1fcf0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1fd00 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1fd10 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
1fd20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1fd30 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
1fd40 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61  *(u32*)pEnd = sa
1fd50 76 65 64 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ved;..          
1fd60 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1fd70 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1fd80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1fd90 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1fda0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1fdb0 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1fdc0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1fdd0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1fde0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1fdf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fe00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1fe10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fe20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1fe30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1fe40 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1fe50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1fe60 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1fe70 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1fe80 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1fe90 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1fea0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1feb0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1fec0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1fed0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1fee0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1fef0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1ff00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ff10 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1ff20 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1ff30 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1ff40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ff50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ff60 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1ff70 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
1ff80 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1ff90 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1ffa0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1ffb0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
1ffc0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1ffd0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1ffe0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1fff0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
20000 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
20010 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
20020 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
20030 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
20040 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20050 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
20060 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
20070 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
20080 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
20090 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
200a0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
200b0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
200c0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
200d0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
200e0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
200f0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
20100 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
20110 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
20120 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
20130 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
20140 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
20150 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
20160 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
20170 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
20180 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
20190 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
201a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
201b0 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
201c0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
201d0 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
201e0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
201f0 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
20200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20210 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
20220 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
20230 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
20240 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
20250 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
20260 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
20270 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
20280 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
20290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
202a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
202b0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
202c0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
202d0 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
202e0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
202f0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
20300 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
20310 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
20320 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
20330 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
20340 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20360 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
20370 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
20380 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
20390 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
203a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
203b0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
203c0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
203d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
203e0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
203f0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28  ager->stmtNRec*(
20400 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
20410 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ze);.        cha
20420 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
20430 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
20440 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d  , pPg->pgno, 7)-
20450 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  4;.        put32
20460 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
20470 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
20480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
20490 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
204a0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
204b0 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 6f  r->pageSize+4, o
204c0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
204d0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
204e0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
204f0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
20500 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
20510 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
20520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
20540 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
20550 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
20560 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
20570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20580 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
20590 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
205a0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
205b0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
205c0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
205d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
205e0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
205f0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
20600 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
20610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20620 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
20630 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
20640 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
20650 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
20660 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
20670 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
20680 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
20690 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
206a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
206b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
206c0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
206d0 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
206e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
206f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
20700 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
20710 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
20720 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
20730 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
20740 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
20750 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
20760 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
20770 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
20780 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
20790 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
207a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
207b0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
207c0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
207d0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
207e0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
207f0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
20800 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
20810 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
20820 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
20830 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
20840 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
20850 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
20860 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
20870 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
20880 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
20890 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
208a0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
208b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
208c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
208d0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
208e0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
208f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20900 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
20910 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
20920 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
20930 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
20940 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
20950 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
20960 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
20970 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  e);..  pagerEnte
20980 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
20990 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
209a0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
209b0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
209c0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
209d0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
209e0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
209f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
20a00 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
20a10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20a20 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
20a30 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
20a40 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
20a50 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
20a60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20a70 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
20a80 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
20a90 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
20aa0 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65   ii;.    int nee
20ab0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
20ac0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
20ad0 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
20ae0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
20af0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
20b00 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
20b10 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
20b20 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
20b30 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
20b40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
20b50 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
20b60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
20b70 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
20b80 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
20b90 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
20ba0 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
20bb0 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
20bc0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
20bd0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
20be0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
20bf0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
20c00 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
20c10 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
20c20 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
20c30 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
20c40 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
20c50 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
20c60 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
20c70 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
20c80 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
20c90 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
20ca0 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71   nPageCount = sq
20cb0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
20cc0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
20cd0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
20ce0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
20cf0 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
20d00 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
20d10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
20d20 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
20d30 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
20d40 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
20d50 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
20d60 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
20d70 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
20d80 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
20d90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
20da0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
20db0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
20dc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
20dd0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
20de0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
20df0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
20e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
20e10 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
20e20 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
20e30 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
20e40 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  e;.      if( !pP
20e50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
20e60 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e   || pg==pPg->pgn
20e70 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  o || .          
20e80 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  pg>pPager->origD
20e90 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65  bSize || !(pPage
20ea0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
20eb0 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29  /8]&(1<<(pg&7)))
20ec0 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20  .      ) {.     
20ed0 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
20ee0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
20ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
20f00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
20f10 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
20f20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
20f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20f50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
20f60 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
20f70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20f80 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
20fa0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
20fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20fc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20fd0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
20fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20ff0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
21000 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
21010 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
21020 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20  r, pg)) ){.     
21030 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
21040 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
21050 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
21060 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21070 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21080 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
21090 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
210a0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
210b0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
210c0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
210d0 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
210e0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
210f0 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
21100 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
21110 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
21120 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
21130 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
21140 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
21150 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
21160 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
21170 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
21180 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
21190 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
211a0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
211b0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
211c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
211d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
211e0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
211f0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
21200 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
21210 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
21220 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
21230 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
21240 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
21250 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
21260 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
21270 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
21280 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
21290 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
212a0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
212b0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
212c0 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
212d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
212e0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
212f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
21300 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
21310 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
21320 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21340 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
21350 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
21360 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
21370 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
21380 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
21390 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
213a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
213b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
213c0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
213d0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
213e0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
213f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
21400 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
21410 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
21420 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
21430 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
21440 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
21450 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
21460 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
21470 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
21480 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
21490 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
214a0 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
214b0 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
214c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
214d0 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
214e0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
214f0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
21500 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
21510 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65   int rc;..  page
21520 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21540 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
21550 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
21560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21570 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21580 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
21590 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
215a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
215b0 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
215c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
215d0 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
215e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
215f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
21600 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
21610 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
21620 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
21630 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
21640 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
21650 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
21660 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
21670 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
21680 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
21690 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
216a0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
216b0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
216c0 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
216d0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
216e0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
216f0 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
21700 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
21710 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
21720 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
21730 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
21740 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
21750 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
21760 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
21770 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
21780 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
21790 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
217a0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
217b0 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
217c0 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
217d0 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
217e0 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
217f0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
21800 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
21810 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
21820 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
21830 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
21840 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
21850 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
21860 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
21870 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
21880 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
21890 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
218a0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
218b0 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
218c0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
218d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
218e0 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
218f0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
21900 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
21910 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
21920 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
21930 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
21940 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
21950 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
21960 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
21970 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
21980 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
21990 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
219a0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
219b0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
219c0 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
219d0 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
219e0 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
219f0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
21a00 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
21a10 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
21a20 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
21a30 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
21a40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
21a50 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
21a60 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
21a70 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
21a80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
21a90 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
21aa0 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
21ab0 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
21ac0 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
21ad0 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
21ae0 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
21af0 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
21b00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
21b10 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
21b20 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
21b30 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
21b40 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
21b50 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
21b60 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
21b70 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21b80 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
21b90 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
21ba0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
21bb0 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  ager);.  pPg->al
21bc0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
21bd0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
21be0 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
21bf0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21c00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21c10 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
21c20 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
21c30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
21c40 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
21c50 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
21c60 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
21c70 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
21c80 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
21c90 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
21ca0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
21cb0 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
21cc0 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
21cd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
21ce0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
21cf0 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
21d00 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
21d10 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
21d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
21d30 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
21d40 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
21d50 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
21d60 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
21d70 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
21d80 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
21d90 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
21da0 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
21db0 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
21dc0 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
21dd0 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
21de0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
21df0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
21e00 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
21e10 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
21e20 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
21e30 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
21e40 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
21e50 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
21e60 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
21e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e80 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
21e90 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
21ea0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
21eb0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
21ec0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
21ed0 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
21ee0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
21ef0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
21f00 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
21f10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
21f20 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
21f30 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
21f40 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
21f50 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
21f60 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
21f70 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
21f80 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
21f90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
21fa0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
21fb0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
21fc0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
21fd0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
21fe0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
21ff0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
22000 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
22010 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
22020 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
22030 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
22040 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
22050 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
22060 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
22070 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
22080 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
22090 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
220a0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
220b0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
220c0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
220d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
220e0 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
220f0 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
22100 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
22110 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
22120 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
22130 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
22140 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
22150 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
22160 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
22170 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22180 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
22190 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
221a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
221b0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67  ->pPager;..  pag
221c0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
221d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
221e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
221f0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
22200 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
22210 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
22220 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
22230 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
22240 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
22250 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
22260 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
22270 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
22280 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
22290 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
222a0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
222b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
222c0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
222d0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
222e0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
222f0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
22300 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
22310 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
22320 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  .    pPg->needRe
22330 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ad = 0;.    if( 
22340 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
22350 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
22360 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
22370 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
22380 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
22390 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43   }.    PAGERTRAC
223a0 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
223b0 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
223c0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
223d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
223e0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
223f0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
22400 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
22410 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
22420 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
22430 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e 53   .   && !pageInS
22440 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
22450 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70    && (int)pPg->p
22460 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
22470 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  tSize .  ){.    
22480 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
22490 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
224a0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
224b0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
224c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
224d0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
224e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
224f0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
22500 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
22510 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67  no&7);.  }.  pag
22520 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
22530 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
22540 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
22550 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
22560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22570 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
22580 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
22590 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
225a0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
225b0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
225c0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
225d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
225e0 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20  nt isDirect){.  
225f0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
22600 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
22610 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ter;.  int rc = 
22620 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
22630 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
22640 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
22650 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
22660 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
22670 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
22680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22690 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
226a0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
226b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
226c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
226d0 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74     if( !isDirect
226e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
226f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22700 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
22710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22720 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
22730 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
22740 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
22750 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
22760 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
22770 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
22780 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
22790 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
227a0 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
227b0 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63  FileVers);.    c
227c0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
227d0 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28  .    put32bits((
227e0 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f  (char*)PGHDR_TO_
227f0 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34  DATA(pPgHdr))+24
22800 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
22810 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69  );..    if( isDi
22820 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rect && pPager->
22830 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
22840 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
22850 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54   *zBuf = PGHDR_T
22860 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a  O_DATA(pPgHdr);.
22870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22880 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
22890 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
228a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
228b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
228c0 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
228d0 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
228e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
228f0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
22900 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
22910 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
22920 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22930 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
22940 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22950 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
22960 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
22970 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
22980 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
22990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
229a0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
229b0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
229c0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
229d0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
229e0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
229f0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
22a00 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
22a10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
22a20 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
22a30 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
22a40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
22a50 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
22a60 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
22a70 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
22a80 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
22a90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22aa0 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
22ab0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
22ac0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
22ad0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
22ae0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
22af0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
22b00 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
22b10 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
22b20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
22b30 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
22b40 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
22b50 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
22b60 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
22b70 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
22b80 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
22b90 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
22ba0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
22bb0 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
22bc0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
22bd0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
22be0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
22bf0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
22c00 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
22c10 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
22c20 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
22c30 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
22c40 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
22c50 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
22c60 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61  seOne(Pager *pPa
22c70 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
22c80 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
22c90 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
22ca0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
22cb0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
22cc0 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
22cd0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
22ce0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
22cf0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
22d00 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
22d10 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65   nTrunc);.  page
22d20 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
22d30 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
22d40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
22d50 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
22d60 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
22d70 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
22d80 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
22d90 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
22da0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
22db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
22dc0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
22dd0 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d  R_SYNCED && !MEM
22de0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  DB && pPager->di
22df0 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
22e00 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
22e10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22e20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
22e30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
22e40 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
22e50 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
22e60 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
22e70 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
22e80 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
22e90 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
22ea0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
22eb0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
22ec0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
22ed0 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
22ee0 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
22ef0 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
22f00 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
22f10 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
22f20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
22f30 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
22f40 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
22f50 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
22f60 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
22f70 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
22f80 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
22f90 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
22fa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22fb0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
22fc0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
22fd0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
22fe0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
22ff0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
23000 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
23010 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
23020 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
23030 2f 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  /.    if( !zMast
23040 65 72 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  er && pPager->jo
23050 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
23060 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
23070 20 26 26 20 6e 54 72 75 6e 63 3d 3d 30 0a 20 20   && nTrunc==0.  
23080 20 20 20 20 26 26 20 28 30 3d 3d 70 50 61 67 65      && (0==pPage
23090 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d  r->pDirty || 0==
230a0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
230b0 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
230c0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
230d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
230e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
230f0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
23100 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
23110 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
23120 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
23130 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
23140 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
23150 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
23160 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
23170 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
23180 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
23190 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
231a0 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
231b0 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
231c0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
231d0 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
231e0 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
231f0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
23200 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
23210 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
23220 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
23230 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
23240 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
23250 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
23260 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
23270 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
23280 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
23290 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
232a0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
232b0 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
232c0 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
232d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
232e0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
232f0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
23300 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
23310 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
23320 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
23330 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
23340 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
23350 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
23360 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
23370 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
23380 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
23390 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
233a0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
233b0 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
233c0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
233d0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
233e0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
233f0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
23400 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
23410 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
23420 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
23430 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
23440 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
23450 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
23460 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
23470 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
23480 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
23490 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
234a0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
234b0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
234c0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
234d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
234e0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
234f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
23500 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23510 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e  .      if( nTrun
23520 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
23530 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
23540 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
23550 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
23560 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
23570 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ages.        ** 
23580 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
23590 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
235a0 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
235b0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
235c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
235d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
235e0 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
235f0 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
23600 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
23610 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
23620 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
23630 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
23640 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
23650 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
23660 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
23670 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26  l[i/8] & (1<<(i&
23680 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70  7))) && i!=iSkip
23690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
236a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
236b0 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
236c0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
236d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
236e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
236f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
23700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23710 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
23720 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23730 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
23740 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
23750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23760 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
23770 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
23780 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
23790 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
237a0 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
237b0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
237c0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
237d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
237e0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
237f0 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
23800 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
23810 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
23820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23830 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
23840 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
23850 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
23860 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
23870 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
23880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
23890 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
238a0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
238b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
238c0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
238d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
238e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
238f0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
23900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23910 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
23920 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
23930 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
23940 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
23950 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
23960 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
23970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
23980 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
23990 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
239a0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
239b0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
239c0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
239d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
239e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
239f0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
23a00 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
23a10 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
23a20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
23a30 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
23a40 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
23a50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
23a60 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
23a70 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
23a80 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
23a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23aa0 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
23ab0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
23ac0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
23ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
23ae0 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
23af0 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
23b00 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
23b10 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
23b20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
23b30 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
23b40 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
23b50 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
23b60 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
23b70 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
23b80 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
23b90 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
23ba0 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 27  nconsistent, it'
23bb0 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20  s.     * better 
23bc0 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
23bd0 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20  _BUSY..     */. 
23be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
23bf0 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  USY;.  }.  pager
23c00 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
23c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
23c20 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
23c30 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
23c40 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
23c50 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
23c60 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
23c70 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
23c80 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
23c90 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
23ca0 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
23cb0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23cc0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
23cd0 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
23ce0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
23cf0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
23d00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23d10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
23d20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23d30 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
23d40 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
23d50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
23d60 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
23d70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
23d80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
23d90 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
23da0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
23db0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23dc0 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
23dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47 45  (pPager);.  PAGE
23de0 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20  RTRACE2("COMMIT 
23df0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
23e00 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
23e10 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
23e20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
23e30 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
23e40 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
23e50 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48  pPg ){.      PgH
23e60 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
23e70 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
23e80 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
23e90 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
23ea0 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67  Hist);.      pPg
23eb0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
23ec0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
23ed0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
23ee0 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
23ef0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
23f00 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
23f10 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
23f20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
23f30 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
23f40 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
23f50 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
23f60 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23  r->pDirty = 0;.#
23f70 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
23f80 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
23f90 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
23fa0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
23fb0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
23fc0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
23fd0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
23fe0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
23ff0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
24000 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
24010 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
24020 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
24030 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
24040 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
24050 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65  #endif.    pPage
24060 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
24070 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
24080 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
24090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
240a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
240b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
240c0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
240d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
240e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
240f0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
24100 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67  _SYNCED || !pPag
24110 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
24120 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
24130 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
24140 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
24150 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
24160 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
24170 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
24180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24190 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
241a0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
241b0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
241c0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
241d0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
241e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
241f0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
24200 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
24210 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
24220 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
24230 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
24240 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
24250 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
24260 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
24270 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
24280 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
24290 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
242a0 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
242b0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
242c0 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
242d0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
242e0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
242f0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
24300 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
24310 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
24320 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
24330 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
24340 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
24350 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
24360 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
24370 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
24380 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24390 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
243a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
243b0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
243c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
243d0 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
243e0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
243f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
24400 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
24410 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
24420 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
24430 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
24440 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
24450 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
24460 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
24470 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
24480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
24490 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
244a0 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
244b0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
244c0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
244d0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
244e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
244f0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
24500 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
24510 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
24520 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24530 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
24540 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
24550 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
24560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
24570 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
24580 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
24590 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
245a0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
245b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
245c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
245d0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
245e0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
245f0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
24600 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
24610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
24620 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
24630 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
24640 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
24650 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
24660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24670 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
24680 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
24690 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
246a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
246b0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
246c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
246d0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
246e0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
246f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
24700 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
24710 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
24720 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
24730 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
24740 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
24750 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
24760 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
24770 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
24780 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
24790 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
247a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
247b0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
247c0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
247d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
247e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
247f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
24800 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
24810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24820 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45  K;.  }..  pagerE
24830 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
24840 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
24850 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
24860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
24870 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
24880 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
24890 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  n(pPager);.    p
248a0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
248b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
248c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
248d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
248e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
248f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
24900 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
24910 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
24920 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
24930 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
24940 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
24950 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
24960 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
24970 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
24980 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
24990 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
249a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
249b0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
249c0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
249d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
249e0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
249f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
24a00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
24a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
24a30 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
24a40 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
24a50 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
24a60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  , 0);.  }.  /* p
24a70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
24a80 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  r); */.  pPager-
24a90 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
24aa0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
24ab0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
24ac0 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
24ad0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
24ae0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
24af0 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
24b00 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
24b10 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
24b20 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
24b30 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
24b40 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
24b50 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
24b60 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
24b70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
24b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24b90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
24ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24bb0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
24bc0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
24bd0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
24be0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
24bf0 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
24c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24c10 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
24c20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24c30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24c40 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
24c50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
24c60 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
24c70 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
24c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24c90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
24ca0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24cb0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
24cc0 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
24cd0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
24ce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24cf0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
24d00 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
24d10 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
24d20 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
24d30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24d40 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
24d50 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
24d60 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
24d70 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
24d80 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
24d90 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
24da0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
24db0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
24dc0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
24dd0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
24de0 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
24df0 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
24e00 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
24e10 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
24e20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
24e30 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
24e40 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
24e50 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
24e60 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
24e70 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
24e80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
24e90 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
24ea0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
24eb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24ec0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
24ed0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
24ee0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
24ef0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
24f00 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
24f10 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
24f20 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
24f30 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
24f40 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
24f50 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
24f60 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
24f70 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
24f80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
24f90 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
24fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24fb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
24fc0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
24fd0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
24fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
24ff0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
25000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
25010 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
25020 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
25030 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
25040 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
25050 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
25060 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
25070 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
25080 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
25090 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
250a0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
250b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
250c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
250d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
250e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
250f0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
25100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25110 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25130 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  pen );.  pagerLe
25140 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ave(pPager);.  p
25150 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
25160 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
25170 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ro( pPager->dbSi
25180 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61  ze/8 + 1 );.  pa
25190 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
251a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
251b0 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
251c0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
251d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
251e0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
251f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25200 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
25210 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
25220 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
25230 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
25240 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
25250 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
25260 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
25270 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
25280 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
25290 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
252a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
252b0 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
252c0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
252d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
252e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
252f0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
25300 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
25310 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
25320 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
25330 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
25340 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
25350 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
25360 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
25370 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
25380 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
25390 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
253a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
253b0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
253c0 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
253d0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
253e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
253f0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
25400 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
25410 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
25420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
25430 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
25440 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
25450 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
25460 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
25470 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
25480 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
25490 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
254a0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
254b0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
254c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
254d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
254e0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
254f0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 74  ;.  rc = pagerSt
25500 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
25510 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
25520 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
25530 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
25540 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
25550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25560 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50  agerStmtCommit(P
25570 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25580 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
25590 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
255a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
255b0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
255c0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45  *pNext;.    PAGE
255d0 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
255e0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
255f0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
25600 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
25610 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
25620 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
25630 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
25640 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25650 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
25660 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
25670 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
25680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25690 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
256a0 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
256b0 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
256c0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
256d0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
256e0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
256f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
25700 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
25710 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mt;.        asse
25720 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d  rt( pHist->inStm
25730 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  t );.        pHi
25740 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
25750 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
25760 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
25770 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
25780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25790 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
257a0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
257b0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
257c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
257d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
257e0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
257f0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
25800 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
25810 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
25820 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
25830 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
25840 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
25850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25860 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
25870 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
25880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25890 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
258a0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
258b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
258c0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
258d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
258e0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
258f0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
25900 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
25910 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
25920 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
25930 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
25940 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67  r *pPg;.      Pg
25950 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
25960 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
25970 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
25980 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65  ; pPg=pHist->pNe
25990 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
259a0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
259b0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
259c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
259d0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
259e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
259f0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
25a00 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
25a10 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
25a20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
25a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
25a40 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
25a50 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
25a60 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
25a70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25a80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25a90 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
25aa0 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ze;.      pager_
25ab0 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
25ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
25ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25af0 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
25b00 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
25b10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25b20 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
25b30 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
25b40 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
25b50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
25b60 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
25b70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c  en = 0;.  pagerL
25b80 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25b90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25ba0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
25bb0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
25bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25bd0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
25be0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
25bf0 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
25c00 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25c10 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
25c20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
25c30 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
25c40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25c50 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
25c60 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
25c70 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
25c80 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
25c90 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
25ca0 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
25cb0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
25cc0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
25cd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
25ce0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
25cf0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
25d00 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
25d10 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
25d20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
25d30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25d40 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
25d50 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
25d60 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
25d70 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
25d80 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
25d90 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
25da0 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
25db0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
25dc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25dd0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
25de0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
25df0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
25e00 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
25e10 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
25e20 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
25e30 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
25e40 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
25e50 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
25e60 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
25e70 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
25e80 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
25e90 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
25ea0 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
25eb0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
25ec0 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
25ed0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
25ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
25ef0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
25f00 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
25f10 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
25f20 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  no in the file. 
25f30 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
25f40 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
25f50 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
25f60 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
25f70 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
25f80 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
25f90 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
25fa0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
25fb0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
25fc0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
25fd0 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
25fe0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
25ff0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
26000 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
26010 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
26020 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
26030 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
26040 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
26050 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
26060 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
26070 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
26080 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
26090 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
260a0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
260b0 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
260c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
260d0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
260e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
260f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
26100 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
26110 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
26120 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
26130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
26140 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
26150 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
26160 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
26170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
26180 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
26190 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
261a0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
261b0 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
261c0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
261d0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
261e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
261f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
26200 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
26210 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
26220 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26230 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
26240 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
26250 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
26260 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
26270 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
26280 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
26290 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
262a0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
262b0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
262c0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
262d0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
262e0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
262f0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
26300 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
26310 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
26320 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
26330 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
26340 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
26350 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
26360 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
26370 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
26380 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
26390 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
263a0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
263b0 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
263c0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
263d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
263e0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
263f0 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
26400 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
26410 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
26420 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
26430 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
26440 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
26450 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
26460 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
26470 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
26480 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
26490 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
264a0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
264b0 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
264c0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
264d0 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
264e0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
264f0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
26500 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
26510 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
26520 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
26530 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
26540 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
26550 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
26560 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
26570 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
26580 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53   */.  pPg->needS
26590 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c  ync = 0;.  pPgOl
265a0 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
265b0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
265c0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
265d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
265e0 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
265f0 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
26600 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
26610 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  d);.    makeClea
26620 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70  n(pPgOld);.    p
26630 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70  Pg->needSync = p
26640 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b  PgOld->needSync;
26650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
26660 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
26670 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
26680 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
26690 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
266a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
266b0 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  {.    pPg->inJou
266c0 72 6e 61 6c 20 3d 20 20 28 70 50 61 67 65 72 2d  rnal =  (pPager-
266d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
266e0 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
266f0 37 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  7)))!=0;.  }else
26700 7b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  {.    pPg->inJou
26710 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
26720 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
26730 79 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70  ync==0 || (int)p
26740 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
26750 44 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20  DbSize );.  }.. 
26760 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
26770 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
26780 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
26790 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
267a0 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61  sh-chain. */.  a
267b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
267c0 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ;.  pPg->pgno = 
267d0 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f  pgno;.  h = pgno
267e0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
267f0 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67  h-1);.  if( pPag
26800 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
26810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26820 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
26830 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
26840 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
26850 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
26860 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
26870 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
26880 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
26890 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
268a0 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
268b0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
268c0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
268d0 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
268e0 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66  Cache = 1;..  if
268f0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
26900 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
26910 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
26920 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
26930 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
26940 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
26950 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
26960 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
26970 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
26980 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
26990 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
269a0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
269b0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
269c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
269d0 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
269e0 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c  Pager.aInJournal
269f0 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65   bit has been se
26a00 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
26a10 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20   be remedied by 
26a20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74  loading.    ** t
26a30 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
26a40 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
26a50 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
26a60 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
26a70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
26a80 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
26a90 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
26aa0 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
26ab0 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
26ac0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
26ad0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
26ae0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
26af0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
26b00 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   rc;.    PgHdr *
26b10 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
26b20 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
26b30 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
26b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
26b50 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
26b60 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
26b70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26b80 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
26b90 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
26ba0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
26bb0 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79    pPgHdr->needSy
26bc0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
26bd0 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  dr->inJournal = 
26be0 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79  1;.    makeDirty
26bf0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
26c00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26c10 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
26c20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
26c30 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
26c40 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
26c50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
26c60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26c70 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
26c80 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
26c90 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
26ca0 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
26cb0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
26cc0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
26cd0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
26ce0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26cf0 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
26d00 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
26d10 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
26d20 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
26d30 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
26d40 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
26d50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
26d60 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
26d70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
26d80 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
26d90 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
26da0 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
26db0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
26dc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
26dd0 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
26de0 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
26df0 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
26e00 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
26e10 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
26e20 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
26e30 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26e40 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
26e50 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26e60 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
26e70 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
26e80 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
26e90 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
26ea0 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
26eb0 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
26ec0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
26ed0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
26ee0 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
26ef0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
26f00 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
26f10 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
26f20 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
26f30 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
26f40 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
26f50 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
26f60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26f70 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
26f80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
26f90 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
26fa0 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
26fb0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
26fc0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
26fd0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
26fe0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
26ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
27000 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
27010 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
27020 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
27030 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
27040 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
27050 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
27060 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
27070 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
27080 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
27090 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
270a0 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
270b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
270c0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
270d0 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
270e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
270f0 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
27100 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
27110 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
27120 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
27130 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
27140 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27150 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
27160 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
27170 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
27180 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
27190 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
271a0 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
271b0 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
271c0 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
271d0 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
271e0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
271f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
27200 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
27210 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
27220 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
27230 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
27240 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
27250 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
27260 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
27270 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
27280 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
27290 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
272a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
272b0 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
272c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
272d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
272e0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
272f0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
27300 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
27310 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
27320 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
27330 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
27340 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
27350 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
27360 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
27370 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
27380 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
27390 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
273a0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
273b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
273c0 4f 20 2a 2f 0a                                   O */.