/ Hex Artifact Content
Login

Artifact d246d888bbdbb97321238f5f71d2f6727b2cc9d8:


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 39  : pager.c,v 1.39
0350: 30 20 32 30 30 37 2f 30 39 2f 31 37 20 30 37 3a  0 2007/09/17 07:
0360: 30 32 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37  02:57 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0690: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
06a0: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
06b0: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
06c0: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
06d0: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
06e0: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
06f0: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0700: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ument..*/.#defin
0710: 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69  e PAGERID(p) ((i
0720: 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66  nt)(p->fd)).#def
0730: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0740: 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a  (fd) ((int)fd)..
0750: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  /*.** The page c
0760: 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20  ache as a whole 
0770: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65  is always in one
0780: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0790: 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  g.** states:.**.
07a0: 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43  **   PAGER_UNLOC
07b0: 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  K        The pag
07c0: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63  e cache is not c
07d0: 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67  urrently reading
07e0: 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   or .**         
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
0800: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0810: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20  se file.  There 
0820: 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  is no.**        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0840: 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  ata held in memo
0850: 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ry.  This is the
0860: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20   initial.**     
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
0890: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
08a0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
08b0: 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74  che is reading t
08c0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73        Writing is
08f0: 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20   not permitted. 
0900: 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   There can be.**
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
0930: 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e  readers accessin
0940: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
0950: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
0970: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0980: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  me..**.**   PAGE
0990: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20  R_RESERVED      
09a0: 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73  This process has
09b0: 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61   reserved the da
09c0: 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69  tabase for writi
09d0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20              but 
09f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  has not yet made
0a00: 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f   any changes.  O
0a10: 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a  nly one process.
0a20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a30: 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69           at a ti
0a40: 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74  me can reserve t
0a50: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
0a60: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0a90: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  e has not been m
0aa0: 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72  odified so other
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0ad0: 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  ses may still be
0ae0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d   reading the on-
0af0: 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  disk.**         
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0b10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
0b20: 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55  **   PAGER_EXCLU
0b30: 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67  SIVE     The pag
0b40: 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69  e cache is writi
0b50: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
0b60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b70: 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73            Access
0b80: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
0b90: 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  No other process
0ba0: 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  es or.**        
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
0bc0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65  hreads can be re
0bd0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
0be0: 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20   while one.**   
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77      process is w
0c10: 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  riting..**.**   
0c20: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
0c30: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f      The pager mo
0c40: 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74  ves to this stat
0c50: 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43  e from PAGER_EXC
0c60: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20  LUSIVE.**       
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20  after all dirty 
0c90: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
0cb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cc0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
0cd0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
0ce0: 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  le has been sync
0cf0: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0d10: 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65  isk. All that re
0d20: 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74  mains to do is t
0d30: 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20  o remove or.**  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74 68       truncate th
0d60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
0d70: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d80: 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  on .**          
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c               wil
0da0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  l be committed..
0db0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0dc0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0dd0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0de0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0df0: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0e00: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0e10: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0e20: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e30: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e40: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e50: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e60: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e70: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e80: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e90: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0ea0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0eb0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0ec0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ed0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0ee0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0ef0: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f00: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f10: 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  hat sqlite3Pager
0f20: 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  Write() can only
0f30: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f40: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f50: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f70: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f80: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0f90: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0fa0: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0fb0: 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45  ED.).** PAGER_RE
0fc0: 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61  SERVED means tha
0fd0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70  t there is an op
0fe0: 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  en rollback jour
0ff0: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e  nal..** The tran
1000: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1010: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1020: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
1030: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
1040: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1050: 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69  file, though wri
1060: 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62  tes to the rollb
1070: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f  ack.** journal o
1080: 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74 20  ccurs with just 
1090: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
10a0: 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65   After an sqlite
10b0: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
10c0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61  .** or sqlite3Pa
10d0: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
10e0: 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 63  o(), the state c
10f0: 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41  an go back to PA
1100: 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f  GER_SHARED,.** o
1110: 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61 74  r it can stay at
1120: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1130: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65 78   if we are in ex
1140: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
1150: 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ode..*/.#define 
1160: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
1170: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
1180: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31 20  R_SHARED      1 
1190: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41    /* same as SHA
11a0: 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  RED_LOCK */.#def
11b0: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
11c0: 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d  ED    2   /* sam
11d0: 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f  e as RESERVED_LO
11e0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
11f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
1200: 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45  4   /* same as E
1210: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f  XCLUSIVE_LOCK */
1220: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1230: 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a  YNCED      5../*
1240: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54  .** If the SQLIT
1250: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1260: 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65  LOCK macro is se
1270: 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d  t to true at com
1280: 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68  pile-time,.** th
1290: 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70  en failed attemp
12a0: 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73 65  ts to get a rese
12b0: 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69  rved lock will i
12c0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
12d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  allback..** This
12e0: 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61 75   is off by defau
12f0: 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c  lt.  To see why,
1300: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1310: 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
1320: 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65  :.** .** Suppose
1330: 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61 64   thread A alread
1340: 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c  y has a shared l
1350: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20  ock and wants a 
1360: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a  reserved lock..*
1370: 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65 61  * Thread B alrea
1380: 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76 65  dy has a reserve
1390: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
13a0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
13b0: 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20  ck.  If.** both 
13c0: 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69 6e  threads are usin
13d0: 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61 6c  g their busy cal
13e0: 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74  lbacks, it might
13f0: 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a   be a long time.
1400: 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ** be for one of
1410: 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69 76   the threads giv
1420: 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20  e up and allows 
1430: 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f  the other to pro
1440: 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20  ceed..** But if 
1450: 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69 6e  the thread tryin
1460: 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65 73  g to get the res
1470: 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73  erved lock gives
1480: 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28   up quickly.** (
1490: 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f  if it never invo
14a0: 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61 6c  kes its busy cal
14b0: 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20  lback) then the 
14c0: 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20  contention will 
14d0: 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71  be.** resolved q
14e0: 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64  uickly..*/.#ifnd
14f0: 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ef SQLITE_BUSY_R
1500: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64  ESERVED_LOCK.# d
1510: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53  efine SQLITE_BUS
1520: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1530: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
1540: 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64  This macro round
1550: 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74  s values up so t
1560: 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  hat if the value
1570: 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 69   is an address i
1580: 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65  t.** is guarante
1590: 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72  ed to be an addr
15a0: 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69 67  ess that is alig
15b0: 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65  ned to an 8-byte
15c0: 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64   boundary..*/.#d
15d0: 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47  efine FORCE_ALIG
15e0: 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58 29  NMENT(X)   (((X)
15f0: 2b 37 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66  +7)&~7)..typedef
1600: 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67   struct PgHdr Pg
1610: 48 64 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  Hdr;../*.** Each
1620: 20 70 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c   pager stores al
1630: 6c 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65  l currently unre
1640: 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 69  ferenced pages i
1650: 6e 20 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a  n a list sorted.
1660: 2a 2a 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65  ** in least-rece
1670: 6e 74 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20  ntly-used (LRU) 
1680: 6f 72 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20  order (i.e. the 
1690: 66 69 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68  first item on th
16a0: 65 20 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e  e list has .** n
16b0: 6f 74 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ot been referenc
16c0: 65 64 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d  ed in a long tim
16d0: 65 2c 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d  e, the last item
16e0: 20 68 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74   has been recent
16f0: 6c 79 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20  ly.** used). An 
1700: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1710: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 69 6e   structure is in
1720: 63 6c 75 64 65 64 20 61 73 20 70 61 72 74 20 6f  cluded as part o
1730: 66 20 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20  f each.** pager 
1740: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
1750: 69 73 20 70 75 72 70 6f 73 65 20 28 76 61 72 69  is purpose (vari
1760: 61 62 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e  able Pager.lru).
1770: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
1780: 6c 6c 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  lly, if memory-m
1790: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
17a0: 62 6c 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65  bled, all unrefe
17b0: 72 65 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a  renced pages .**
17c0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
17d0: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
17e0: 20 28 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c   (global variabl
17f0: 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  e sqlite3LruPage
1800: 4c 69 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  List)..**.** In 
1810: 62 6f 74 68 20 63 61 73 65 73 2c 20 74 68 65 20  both cases, the 
1820: 50 61 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69  PagerLruList.pFi
1830: 72 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62  rstSynced variab
1840: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  le points to.** 
1850: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
1860: 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
1870: 69 6e 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f  ing list that do
1880: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1890: 6e 0a 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65  n.** fsync() ope
18a0: 72 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74  ration before it
18b0: 27 73 20 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65  's memory can be
18c0: 20 72 65 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e   reclaimed. If n
18d0: 6f 20 73 75 63 68 0a 2a 2a 20 70 61 67 65 20 65  o such.** page e
18e0: 78 69 73 74 73 2c 20 50 61 67 65 72 4c 72 75 4c  xists, PagerLruL
18f0: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1900: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1910: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1920: 63 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ct PagerLruList 
1930: 50 61 67 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74  PagerLruList;.st
1940: 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69 73  ruct PagerLruLis
1950: 74 20 7b 0a 20 20 50 67 48 64 72 20 2a 70 46 69  t {.  PgHdr *pFi
1960: 72 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rst;         /* 
1970: 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 4c 52  First page in LR
1980: 55 20 6c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64  U list */.  PgHd
1990: 72 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20  r *pLast;       
19a0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
19b0: 69 6e 20 4c 52 55 20 6c 69 73 74 20 28 74 68 65  in LRU list (the
19c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 75   most recently u
19d0: 73 65 64 29 20 2a 2f 0a 20 20 50 67 48 64 72 20  sed) */.  PgHdr 
19e0: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
19f0: 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 69   /* First page i
1a00: 6e 20 6c 69 73 74 20 77 69 74 68 20 50 67 48 64  n list with PgHd
1a10: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
1a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
1a30: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1a40: 72 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  re contains the 
1a50: 6e 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f 75  next and previou
1a60: 73 20 70 6f 69 6e 74 65 72 73 20 75 73 65 64 0a  s pointers used.
1a70: 2a 2a 20 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48  ** to link a PgH
1a80: 64 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  dr structure int
1a90: 6f 20 61 20 50 61 67 65 72 4c 72 75 4c 69 73 74  o a PagerLruList
1aa0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a   linked list. .*
1ab0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1ac0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61   PagerLruLink Pa
1ad0: 67 65 72 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75  gerLruLink;.stru
1ae0: 63 74 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  ct PagerLruLink 
1af0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  {.  PgHdr *pNext
1b00: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 72 65 76  ;.  PgHdr *pPrev
1b10: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.};../*.** Each
1b20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1b30: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1b40: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1b50: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1b60: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1b70: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1b80: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1b90: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
1ba0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
1bb0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
1bc0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
1bd0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
1be0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
1bf0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1c00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c10: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1c20: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1c30: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1c40: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1c50: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1c60: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1c70: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1c80: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1c90: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1ca0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1cb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1cc0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1cd0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
1ce0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
1cf0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1d00: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1d10: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1d20: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1d30: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1d40: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1d50: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1d60: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1d70: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1d80: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1d90: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1da0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1db0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1dc0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1dd0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
1de0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
1df0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1e00: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1e10: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1e20: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1e30: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1e40: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1e50: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1e60: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1e70: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1e80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1e90: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1ea0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65  e file..**.** De
1eb0: 74 61 69 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61  tails of importa
1ec0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 65 6c 65  nt structure ele
1ed0: 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65  ments:.**.** nee
1ee0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20  dSync.**.**     
1ef0: 49 66 20 74 68 69 73 20 69 73 20 74 72 75 65 2c  If this is true,
1f00: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
1f10: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
1f20: 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 61 67  to write the pag
1f30: 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74  e.**     content
1f40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f50: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
1f60: 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65  ginal content ne
1f70: 65 64 65 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20  eded.**     for 
1f80: 72 6f 6c 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74  rollback has not
1f90: 20 62 79 20 73 79 6e 63 65 64 20 74 6f 20 74 68   by synced to th
1fa0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
1fb0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20  journal..**     
1fc0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  The original con
1fd0: 74 65 6e 74 20 6d 61 79 20 68 61 76 65 20 62 65  tent may have be
1fe0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1ff0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2000: 61 6c 0a 2a 2a 20 20 20 20 20 62 75 74 20 69 74  al.**     but it
2010: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
2020: 6e 20 73 79 6e 63 65 64 2e 20 20 53 6f 20 77 65  n synced.  So we
2030: 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
2040: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2050: 20 20 20 20 20 66 69 6c 65 20 62 65 63 61 75 73       file becaus
2060: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
2070: 6d 69 67 68 74 20 63 61 75 73 65 20 74 68 65 20  might cause the 
2080: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
2090: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20a0: 74 6f 20 6e 65 76 65 72 20 72 65 61 63 68 20 74  to never reach t
20b0: 68 65 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  he disk.  It is 
20c0: 61 73 20 69 66 20 74 68 65 20 77 72 69 74 65 20  as if the write 
20d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
20e0: 69 6c 65 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20  ile.**     does 
20f0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 20  not occur until 
2100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2110: 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20   is synced..**  
2120: 20 20 20 0a 2a 2a 20 20 20 20 20 54 68 69 73 20     .**     This 
2130: 66 6c 61 67 20 69 73 20 66 61 6c 73 65 20 69 66  flag is false if
2140: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
2150: 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2160: 73 20 77 68 61 74 0a 2a 2a 20 20 20 20 20 63 75  s what.**     cu
2170: 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 69  rrently exists i
2180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2190: 69 6c 65 2e 20 20 54 68 65 20 6e 65 65 64 53 79  ile.  The needSy
21a0: 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a  nc flag is also.
21b0: 2a 2a 20 20 20 20 20 66 61 6c 73 65 20 69 66 20  **     false if 
21c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
21d0: 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  tent has been wr
21e0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6d 61 69  itten to the mai
21f0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20  n rollback.**   
2200: 20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79    journal and sy
2210: 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 70 61  nced.  If the pa
2220: 67 65 20 72 65 70 72 65 73 65 6e 74 73 20 61 20  ge represents a 
2230: 6e 65 77 20 70 61 67 65 20 74 68 61 74 20 68 61  new page that ha
2240: 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 61 64  s.**     been ad
2250: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
2260: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2270: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
2280: 65 6e 74 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73  ent.**     trans
2290: 61 63 74 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64  action, the need
22a0: 53 79 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75  Sync flag is tru
22b0: 65 20 75 6e 74 69 6c 20 74 68 65 20 6f 72 69 67  e until the orig
22c0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a  inal database.**
22d0: 20 20 20 20 20 73 69 7a 65 20 69 6e 20 74 68 65       size in the
22e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
22f0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
2300: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69  to disk..**.** i
2310: 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20  nJournal.**.**  
2320: 20 20 20 54 68 69 73 20 69 73 20 74 72 75 65 20     This is true 
2330: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
2340: 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 77 72  page has been wr
2350: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
2360: 61 69 6e 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  ain.**     rollb
2370: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
2380: 69 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  is is always fal
2390: 73 65 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73  se for new pages
23a0: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20   added to.**    
23b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
23c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 75  database file du
23d0: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
23e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
23f0: 20 20 20 20 20 41 6e 64 20 74 68 69 73 20 66 6c       And this fl
2400: 61 67 20 73 61 79 73 20 6e 6f 74 68 69 6e 67 20  ag says nothing 
2410: 61 62 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72  about whether or
2420: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
2430: 0a 2a 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e  .**     has been
2440: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2450: 20 20 46 6f 72 20 70 61 67 65 73 20 74 68 61 74    For pages that
2460: 20 61 72 65 20 69 6e 20 74 68 65 20 6f 72 69 67   are in the orig
2470: 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61  inal.**     data
2480: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66  base file, the f
2490: 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
24a0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
24b0: 73 20 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a  s be true:.**.**
24c0: 20 20 20 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c         inJournal
24d0: 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
24e0: 6f 75 72 6e 61 6c 5b 28 70 67 6e 6f 2d 31 29 2f  ournal[(pgno-1)/
24f0: 38 5d 20 26 20 28 31 3c 3c 28 28 70 67 6e 6f 2d  8] & (1<<((pgno-
2500: 31 29 25 38 29 29 21 3d 30 0a 2a 2a 0a 2a 2a 20  1)%8))!=0.**.** 
2510: 20 20 20 20 54 68 65 20 70 50 61 67 65 72 2d 3e      The pPager->
2520: 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20 61 72 72  aInJournal[] arr
2530: 61 79 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  ay is only valid
2540: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
2550: 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 6f  l.**     pages o
2560: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
2570: 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74 68  not new pages th
2580: 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  at are added to 
2590: 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20 6f  the end.**     o
25a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  f the database, 
25b0: 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68 65  so obviously the
25c0: 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69 6f   above expressio
25d0: 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 20  n cannot be.**  
25e0: 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65 77     valid for new
25f0: 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65 77   pages.  For new
2600: 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61 6c   pages inJournal
2610: 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2a   is always 0..**
2620: 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a 20  .** dirty.**.** 
2630: 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20 74      When true, t
2640: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
2650: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2660: 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 0a  e page has been.
2670: 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64 20  **     modified 
2680: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
2690: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
26a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26b0: 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61 6c  e..**     If fal
26c0: 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  se, it means tha
26d0: 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f 6e  t either the con
26e0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26f0: 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68 61   is.**     uncha
2700: 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68 65  nged or else the
2710: 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69 6d   content is unim
2720: 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20 64  portant and we d
2730: 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61 72  o not.**     car
2740: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
2750: 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65 64   it is preserved
2760: 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52 6f  ..**.** alwaysRo
2770: 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 20  llback.**.**    
2780: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2790: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
27a0: 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
27b0: 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  API should be.**
27c0: 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f 72       ignored for
27d0: 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68 65   this page.  The
27e0: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
27f0: 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f 20  API attempts to 
2800: 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74 20  say.**     that 
2810: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2820: 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  he page on disk 
2830: 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 28  is unimportant (
2840: 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20 20  it is an.**     
2850: 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20 74  unused page on t
2860: 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f 20  he freelist) so 
2870: 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65 63  that it is unnec
2880: 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20 20  essary to .**   
2890: 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67    rollback chang
28a0: 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  es to this page 
28b0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e 74  because the cont
28c0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 0a  ent of the page.
28d0: 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e 67  **     can chang
28e0: 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  e without changi
28f0: 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f  ng the meaning o
2900: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2910: 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c 61   This.**     fla
2920: 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20  g overrides any 
2930: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 61  DontRollback() a
2940: 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66 6c  ttempt.  This fl
2950: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20  ag is set.**    
2960: 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61   when a page tha
2970: 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  t originally con
2980: 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61 74  tained valid dat
2990: 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  a is added to.**
29a0: 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69 73       the freelis
29b0: 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68 65  t.  Later in the
29c0: 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
29d0: 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69 67  n, this page mig
29e0: 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75 6c  ht.**     be pul
29f0: 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  led from the fre
2a00: 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  elist and reused
2a10: 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 64   for something d
2a20: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20 20  ifferent.**     
2a30: 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69 6e  and at that poin
2a40: 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  t the DontRollba
2a50: 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62 65  ck() API will be
2a60: 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65 0a   called because.
2a70: 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61 6b  **     pages tak
2a80: 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  en from the free
2a90: 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65 64  list do not need
2aa0: 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65 64   to be protected
2ab0: 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   by.**     the r
2ac0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2ad0: 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67 20    But this flag 
2ae0: 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70 61  says that the pa
2af0: 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e 6f  ge was.**     no
2b00: 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61 72  t originally par
2b10: 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  t of the freelis
2b20: 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74 69  t so that it sti
2b30: 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20 20  ll needs to.**  
2b40: 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63     be rolled bac
2b50: 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61 6e  k in spite of an
2b60: 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f 6e  y subsequent Don
2b70: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
2b80: 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65 61  s..**.** needRea
2b90: 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69  d .**.**     Thi
2ba0: 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77 68  s flag means (wh
2bb0: 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74 68  en true) that th
2bc0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2bd0: 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20 20   page has.**    
2be0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c 6f   not yet been lo
2bf0: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e 20  aded from disk. 
2c00: 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   The in-memory c
2c10: 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a 2a  ontent is just.*
2c20: 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20 20  *     garbage.  
2c30: 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a 65  (Actually, we ze
2c40: 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c 20  ro the content, 
2c50: 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20 6e  but you should n
2c60: 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20 61  ot.**     make a
2c70: 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ny assumptions a
2c80: 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
2c90: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29 20   nevertheless.) 
2ca0: 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 63   If the.**     c
2cb0: 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
2cc0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
2cd0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  it should be rea
2ce0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20  d from the.**   
2cf0: 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62    original datab
2d00: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72  ase file..*/.str
2d10: 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61  uct PgHdr {.  Pa
2d20: 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d40: 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69  The pager to whi
2d50: 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c  ch this page bel
2d60: 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ongs */.  Pgno p
2d70: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
2d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d90: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
2da0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
2db0: 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c  gHdr *pNextHash,
2dc0: 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a   *pPrevHash;  /*
2dd0: 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   Hash collision 
2de0: 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e  chain for PgHdr.
2df0: 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72 4c  pgno */.  PagerL
2e00: 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20 20  ruLink free;    
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2e20: 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66 72   and previous fr
2e30: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
2e40: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
2e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  ges */.  u8 inJo
2e80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2ea0: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
2eb0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2ec0: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
2ef0: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
2f00: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
2f10: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
2f40: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
2f50: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
2f60: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f80: 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c  Disable DontRoll
2f90: 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20  back() for this 
2fa0: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  page */.  u8 nee
2fb0: 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  dRead;          
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
2fd0: 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67 65   content if Page
2fe0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
2ff0: 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ed */.  short in
3000: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3020: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
3030: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
3040: 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65  r *pDirty, *pPre
3050: 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69  vDirty;    /* Di
3060: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  rty pages */.#if
3070: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3080: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3090: 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c 69  ENT.  PagerLruLi
30a0: 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20 20  nk gfree;       
30b0: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 6c       /* Global l
30c0: 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20 70  ist of nRef==0 p
30d0: 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  ages */.#endif.#
30e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
30f0: 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70  CK_PAGES.  u32 p
3100: 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ageHash;.#endif.
3110: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20 20    void *pData;  
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f   /* Page data */
3140: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
3150: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
3160: 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  l data appended 
3170: 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20 2a  to this header *
3180: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  /.};../*.** For 
3190: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  an in-memory onl
31a0: 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65  y database, some
31b0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
31c0: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
31d0: 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67  bout.** each pag
31e0: 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65  e so that change
31f0: 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  s can be rolled 
3200: 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20  back.  (Journal 
3210: 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a  files are not.**
3220: 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d   used for in-mem
3230: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20  ory databases.) 
3240: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
3250: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64  nformation is ad
3260: 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e  ded to.** the en
3270: 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41  d of every EXTRA
3280: 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65   block for in-me
3290: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  mory databases..
32a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  **.** This infor
32b0: 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76  mation could hav
32c0: 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72  e been added dir
32d0: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48  ectly to the PgH
32e0: 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  dr structure..**
32f0: 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75   But then it wou
3300: 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78  ld take up an ex
3310: 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73  tra 8 bytes of s
3320: 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20  torage on every 
3330: 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f  PgHdr.** even fo
3340: 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74  r disk-based dat
3350: 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69  abases.  Splitti
3360: 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20  ng it out saves 
3370: 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a  8 bytes.  This.*
3380: 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69  * is only a savi
3390: 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20  ngs of 0.8% but 
33a0: 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65  those percentage
33b0: 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70  s add up..*/.typ
33c0: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69  edef struct PgHi
33d0: 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b  story PgHistory;
33e0: 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72  .struct PgHistor
33f0: 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b  y {.  u8 *pOrig;
3400: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
3410: 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73   page text.  Res
3420: 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20  tore to this on 
3430: 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20  a full rollback 
3440: 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20  */.  u8 *pStmt; 
3450: 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69      /* Text as i
3460: 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67  t was at the beg
3470: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75  inning of the cu
3480: 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
3490: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
34a0: 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d  tStmt, *pPrevStm
34b0: 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70  t;  /* List of p
34c0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
34d0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ement journal */
34e0: 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20  .  u8 inStmt;   
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20    /* TRUE if in 
3510: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3520: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a  bjournal */.};..
3530: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
3540: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
3550: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
3560: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
3570: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
3580: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
3590: 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66  DEC1(P,D,N,X) if
35a0: 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29  ( P->xCodec!=0 )
35b0: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
35c0: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
35d0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45   }.# define CODE
35e0: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
35f0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d  ar*)(P->xCodec!=
3600: 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  0?P->xCodec(P->p
3610: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a  CodecArg,D,N,X):
3620: 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  D)).#else.# defi
3630: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
3640: 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23  X) /* NO-OP */.#
3650: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
3660: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
3670: 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  D).#endif../*.**
3680: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
3690: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
36a0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
36b0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
36c0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
36d0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
36e0: 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29 2d  DATA(P)    ((P)-
36f0: 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65 20  >pData).#define 
3700: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47  PGHDR_TO_EXTRA(G
3710: 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 47  ,P) ((void*)&((G
3720: 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 50  )[1])).#define P
3730: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
3740: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
3750: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
3760: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
3770: 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ]))[(PGR)->nExtr
3780: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
3790: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
37a0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
37b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
37c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
37d0: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
37e0: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
37f0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
3800: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
3810: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
3820: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
3830: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
3840: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
3850: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
3860: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
3870: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
3880: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
3890: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
38a0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
38b0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
38c0: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
38d0: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
38e0: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
38f0: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
3900: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
3910: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
3920: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
3930: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
3940: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
3950: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
3960: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
3970: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
3980: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
3990: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
39a0: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
39b0: 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65  Pager {.  sqlite
39c0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
39d0: 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63        /* OS func
39e0: 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72  tions to use for
39f0: 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72   IO */.  u8 jour
3a00: 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  nalOpen;        
3a10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3a20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
3a30: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
3a40: 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  d */.  u8 journa
3a50: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
3a60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
3a70: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
3a80: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
3a90: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
3aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
3ab0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
3ac0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
3ad0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64  e */.  u8 noRead
3ae0: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
3af0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
3b00: 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65  her to obtain re
3b10: 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20  adlocks */.  u8 
3b20: 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  stmtOpen;       
3b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3b40: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
3b50: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20  t subjournal is 
3b60: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  open */.  u8 stm
3b70: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
3b80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
3b90: 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d   are in a statem
3ba0: 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
3bb0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41  on */.  u8 stmtA
3bc0: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
3bd0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74      /* Open stmt
3be0: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
3bf0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
3c00: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
3c10: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3c20: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
3c30: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
3c40: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
3c50: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
3c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
3c70: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
3c80: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
3c90: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
3ca0: 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20   sync_flags;    
3cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3cc0: 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   of SYNC_NORMAL 
3cd0: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a  or SYNC_FULL */.
3ce0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d00: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3d10: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3d20: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3d30: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3d50: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3d60: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3d70: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3d90: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
3da0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
3db0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3dd0: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
3de0: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
3df0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3e00: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e20: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
3e30: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
3e40: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
3e50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
3e60: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
3e70: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
3e80: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3e90: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3eb0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
3ec0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
3ed0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ef0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3f00: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3f10: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3f20: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f40: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3f50: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3f60: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3f70: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
3f80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3f90: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
3fa0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
3fb0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
3fc0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3fd0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3fe0: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3ff0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
4000: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
4010: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
4020: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
4030: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
4040: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
4050: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
4060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4070: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
4080: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
4090: 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20   int dbSize;    
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40b0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
40c0: 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  in the file */. 
40d0: 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b   int origDbSize;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40f0: 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68  dbSize before th
4100: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65  e current change
4110: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69   */.  int stmtSi
4120: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4130: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74    /* Size of dat
4140: 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29  abase (in pages)
4150: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
4160: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4190: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
41a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
41b0: 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20   u32 cksumInit; 
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41d0: 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c  Quasi-random val
41e0: 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72  ue added to ever
41f0: 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  y checksum */.  
4200: 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20  int stmtNRec;   
4210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4220: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
4230: 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72   in stmt subjour
4240: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  nal */.  int nEx
4250: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4260: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4270: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4280: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4290: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ge */.  int page
42a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
42b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
42c0: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
4300: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
4310: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ages */.  int nR
4320: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
4330: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4340: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
4350: 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52  es with PgHdr.nR
4360: 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ef>0 */.  int mx
4370: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
4380: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
4390: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
43a0: 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68   to hold in cach
43b0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
43c0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
43d0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
43e0: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
43f0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4400: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
4410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4420: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
4430: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
4440: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
4450: 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20  8 *aInStmt;     
4460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4470: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
4480: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
4490: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
44a0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
44b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
44c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
44d0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
44e0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
44f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4500: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
4510: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
4520: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
4530: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
4540: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
4550: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
4560: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e    char *zStmtJrn
4570: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
4580: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61   Name of the sta
4590: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
45a0: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
45b0: 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b  _file *fd, *jfd;
45c0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
45d0: 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74  criptors for dat
45e0: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
45f0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
4600: 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20  ile *stfd;      
4610: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4620: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74  iptor for the st
4630: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
4640: 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  al*/.  BusyHandl
4650: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
4660: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
4670: 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64   sqlite.busyHand
4680: 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72  ler */.  PagerLr
4690: 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20  uList lru;      
46a0: 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74       /* LRU list
46b0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
46c0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
46f0: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
4700: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
4710: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4720: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
4730: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
4740: 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  al */.  PgHdr *p
4750: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
4760: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
4770: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a  ll dirty pages *
4780: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
4790: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
47a0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
47b0: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
47c0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
47d0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
47f0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
4800: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
4810: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73  eader */.  i64 s
4820: 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20  tmtHdrOff;      
4830: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4840: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
4850: 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74  ritten this stat
4860: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73  ement */.  i64 s
4870: 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20  tmtCksum;       
4880: 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49         /* cksumI
4890: 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65  nit when stateme
48a0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a  nt was started *
48b0: 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a  /.  i64 stmtJSiz
48c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
48d0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
48e0: 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  al at stmt_begin
48f0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74  () */.  int sect
4900: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
4910: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
4920: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
4930: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69  g rollback */.#i
4940: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4950: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4960: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4970: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4980: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
4990: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49b0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49c0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49d0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  if.  void (*xDes
49e0: 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a  tructor)(DbPage*
49f0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
4a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4a10: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
4a20: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
4a30: 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  iter)(DbPage*,in
4a40: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
4a50: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
4a60: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
4a70: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4a80: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
4a90: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
4aa0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
4ab0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
4ac0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
4ad0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
4ae0: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
4af0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
4b00: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
4b10: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
4b20: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
4b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4b40: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
4b50: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
4b60: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
4b80: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
4b90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
4ba0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
4bb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4bc0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
4bd0: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bf0: 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c   Doubly linked l
4c00: 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e  ist of pagers on
4c10: 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65   which */.  Page
4c20: 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20  r *pPrev;       
4c30: 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
4c40: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
4c50: 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f  y() will work */
4c60: 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b  .  int iInUseMM;
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c80: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e  * Non-zero if un
4c90: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20  available to MM 
4ca0: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 44  */.  int iInUseD
4cb0: 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B;              
4cc0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4cd0: 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  in sqlite3_relea
4ce0: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23  se_memory() */.#
4cf0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
4d00: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
4d10: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
4d20: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
4d30: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
4d40: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4d50: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4d60: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4d70: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
4d80: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d  ile changes */.}
4d90: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
4da0: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
4db0: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
4dc0: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
4dd0: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
4de0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
4df0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
4e00: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
4e10: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
4e20: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4e30: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
4e40: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
4e50: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
4e60: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4e70: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
4e80: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4e90: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
4ea0: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
4eb0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
4ec0: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
4ed0: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
4ee0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
4ef0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
4f00: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
4f10: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
4f20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4f30: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
4f40: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74  o journal */.int
4f50: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70   sqlite3_pager_p
4f60: 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b  gfree_count = 0;
4f70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4f80: 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72 65   cache pages fre
4f90: 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  ed */.# define P
4fa0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
4fb0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
4fc0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
4fd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4fe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
4ff0: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
5000: 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62  e head of a doub
5010: 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a  le-linked list.*
5020: 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20  * of all pagers 
5030: 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c  that are eligibl
5040: 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c  e for page steal
5050: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71  ing by the.** sq
5060: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
5070: 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63 65  mory() interface
5080: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68 69  .  Access to thi
5090: 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f  s list is.** pro
50a0: 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53 51  tected by the SQ
50b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
50c0: 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f  C_MEM2 mutex..*/
50d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
50e0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
50f0: 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50  AGEMENT.static P
5100: 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67  ager *sqlite3Pag
5110: 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74  erList = 0;.stat
5120: 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ic PagerLruList 
5130: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
5140: 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  st = {0, 0, 0};.
5150: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  #endif.../*.** J
5160: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
5170: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
5180: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
5190: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
51a0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
51b0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
51c0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
51d0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
51e0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
51f0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
5200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
5210: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
5220: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
5230: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
5240: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
5250: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
5260: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
5270: 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  egin.** written,
5280: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
5290: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
52a0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
52b0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
52c0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
52d0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
52e0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
52f0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
5300: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
5310: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
5320: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
5330: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
5340: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
5350: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
5360: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
5370: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
5380: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5390: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
53a0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
53b0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
53c0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
53d0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
53e0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
53f0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
5400: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
5410: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
5420: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
5430: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5440: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5450: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5460: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5470: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
5480: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
5490: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
54a0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
54b0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
54c0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
54d0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
54e0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
54f0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
5500: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
5510: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
5520: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
5530: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5540: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5550: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5560: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5570: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
5580: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
5590: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
55a0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
55b0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
55c0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
55d0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
55e0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
55f0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
5600: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
5610: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
5620: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
5630: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5640: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5650: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5660: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5670: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
5680: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
5690: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
56a0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
56b0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
56c0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
56d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
56e0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
56f0: 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  and of each page
5700: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
5710: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
5720: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
5730: 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65  g macros..*/.#de
5740: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5750: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
5760: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
5770: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
5780: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5790: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
57a0: 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72  er. In the futur
57b0: 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65  e, this could be
57c0: 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  .** set to some 
57d0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
57e0: 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c  the disk control
57f0: 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61  ler. The importa
5800: 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69  nt.** characteri
5810: 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20  stic is that it 
5820: 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  is the same size
5830: 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f   as a disk secto
5840: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  r..*/.#define JO
5850: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5860: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
5870: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
5880: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
5890: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
58a0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
58b0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
58c0: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
58d0: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
58e0: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
58f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5900: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
5910: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
5920: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
5930: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
5940: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
5950: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
5960: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
5970: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
5980: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5990: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
59a0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
59b0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
59c0: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
59d0: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
59e0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47   Page number PAG
59f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65  ER_MJ_PGNO is ne
5a00: 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53  ver used in an S
5a10: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28  QLite database (
5a20: 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65  it is.** reserve
5a30: 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72  d for working ar
5a40: 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70  ound a windows/p
5a50: 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69  osix incompatibi
5a60: 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20  lity). It is.** 
5a70: 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  used in the jour
5a80: 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  nal to signify t
5a90: 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65  hat the remainde
5aa0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
5ab0: 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76   file .** is dev
5ac0: 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20  oted to storing 
5ad0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
5ae0: 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72   name - there ar
5af0: 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20  e no more pages 
5b00: 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e  to.** roll back.
5b10: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   See comments fo
5b20: 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  r function write
5b30: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
5b40: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
5b50: 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52  /* #define PAGER
5b60: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
5b70: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
5b80: 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64  pageSize)) */.#d
5b90: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
5ba0: 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47  GNO(x) ((PENDING
5bb0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
5bc0: 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  Size))+1)../*.**
5bd0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
5be0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
5bf0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
5c00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
5c10: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
5c20: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  47../*.** The pa
5c30: 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70  gerEnter() and p
5c40: 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74  agerLeave() rout
5c50: 69 6e 65 73 20 61 63 71 75 69 72 65 20 61 6e 64  ines acquire and
5c60: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75   release.** a mu
5c70: 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65  tex on each page
5c80: 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20 69 73  r.  The mutex is
5c90: 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a   recursive..**.*
5ca0: 2a 20 54 68 69 73 20 69 73 20 61 20 73 70 65 63  * This is a spec
5cb0: 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65  ial-purpose mute
5cc0: 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76  x.  It only prov
5cd0: 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c  ides mutual excl
5ce0: 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e  usion.** between
5cf0: 20 74 68 65 20 42 74 72 65 65 20 61 6e 64 20 74   the Btree and t
5d00: 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65  he Memory Manage
5d10: 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c  ment sqlite3_rel
5d20: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a  ease_memory().**
5d30: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64   function.  It d
5d40: 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c  oes not prevent,
5d50: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77   for example, tw
5d60: 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63  o Btrees from ac
5d70: 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73  cessing.** the s
5d80: 61 6d 65 20 70 61 67 65 72 20 61 74 20 74 68 65  ame pager at the
5d90: 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68   same time.  Oth
5da0: 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f  er general-purpo
5db0: 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a  se mutexes in.**
5dc0: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
5dd0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f   handle that cho
5de0: 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  re..*/.#ifdef SQ
5df0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
5e00: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
5e10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5e20: 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29  rEnter(Pager *p)
5e30: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
5e40: 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  B++;.    if( p->
5e50: 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69  iInUseMM && p->i
5e60: 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a 20 20  InUseDB==1 ){.  
5e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5e80: 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  x *mutex;.      
5e90: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
5ea0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
5eb0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5ec0: 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70 2d 3e  MEM2);.      p->
5ed0: 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20  iInUseDB = 0;.  
5ee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5ef0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
5f00: 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44        p->iInUseD
5f10: 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  B = 1;.      sql
5f20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
5f30: 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  (mutex);.    }. 
5f40: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49     assert( p->iI
5f50: 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d  nUseMM==0 );.  }
5f60: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
5f70: 61 67 65 72 4c 65 61 76 65 28 50 61 67 65 72 20  agerLeave(Pager 
5f80: 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55  *p){.    p->iInU
5f90: 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65  seDB--;.    asse
5fa0: 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e  rt( p->iInUseDB>
5fb0: 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
5fc0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 45 6e  # define pagerEn
5fd0: 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ter(X).# define 
5fe0: 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23 65  pagerLeave(X).#e
5ff0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  ndif../*.** Enab
6000: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  le reference cou
6010: 6e 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72  nt tracking (for
6020: 20 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65   debugging) here
6030: 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  :.*/.#ifdef SQLI
6040: 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 70  TE_DEBUG.  int p
6050: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
6060: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74  able = 0;.  stat
6070: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
6080: 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b  finfo(PgHdr *p){
6090: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
60a0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  cnt = 0;.    if(
60b0: 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f   !pager3_refinfo
60c0: 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e  _enable ) return
60d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
60e0: 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ugPrintf(.      
60f0: 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64   "REFCNT: %4d ad
6100: 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33 64 20  dr=%p nRef=%-3d 
6110: 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20  total=%d\n",.   
6120: 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48      p->pgno, PGH
6130: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
6140: 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61 67 65  ->nRef, p->pPage
6150: 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  r->nRef.    );. 
6160: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
6170: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
6180: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
6190: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
61a0: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
61b0: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
61c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
61d0: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  NFO(X).#endif../
61e0: 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50  *.** Add page pP
61f0: 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  g to the end of 
6200: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6210: 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72 75 63  managed by struc
6220: 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70  ture.** pList (p
6230: 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  Pg becomes the l
6240: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
6250: 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f 73 74   list - the most
6260: 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73   recently .** us
6270: 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ed). Argument pL
6280: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6290: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
62a0: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
62b0: 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67  ee,.** depending
62c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
62d0: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
62e0: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
62f0: 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61  ific or.** globa
6300: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6310: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 41  tatic void listA
6320: 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  dd(PagerLruList 
6330: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
6340: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6350: 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e  dr *pPg){.  pLin
6360: 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  k->pNext = 0;.  
6370: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  pLink->pPrev = p
6380: 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69  List->pLast;..#i
6390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
63a0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
63b0: 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c  MENT.  assert(pL
63c0: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20  ink==&pPg->free 
63d0: 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  || pLink==&pPg->
63e0: 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  gfree);.  assert
63f0: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66  (pLink==&pPg->gf
6400: 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73  ree || pList!=&s
6410: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6420: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  t);.#endif..  if
6430: 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29  ( pList->pLast )
6440: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
6450: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
6460: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 20 20   (char *)pPg;.  
6470: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6480: 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pLastLink = (Pag
6490: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
64a0: 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73  u8 *)pList->pLas
64b0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
64c0: 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  LastLink->pNext 
64d0: 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = pPg;.  }else{.
64e0: 20 20 20 20 61 73 73 65 72 74 28 21 70 4c 69 73      assert(!pLis
64f0: 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20 20 20  t->pFirst);.    
6500: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6510: 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73  pPg;.  }..  pLis
6520: 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  t->pLast = pPg;.
6530: 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e 70 46    if( !pList->pF
6540: 69 72 73 74 53 79 6e 63 65 64 20 26 26 20 70 50  irstSynced && pP
6550: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
6560: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6570: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
6580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6590: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
65a0: 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
65b0: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
65c0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4c  pointed to by pL
65d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ist..**.** Argum
65e0: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
65f0: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6600: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6610: 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65 6e 64  g->gfree, depend
6620: 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ing .** on wheth
6630: 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20  er pPg is being 
6640: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67  added to the pag
6650: 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 20 67  er-specific or g
6660: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6670: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6680: 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65 72 4c  istRemove(PagerL
6690: 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50  ruList *pList, P
66a0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69  agerLruLink *pLi
66b0: 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  nk, PgHdr *pPg){
66c0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63  .  int iOff = (c
66d0: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
66e0: 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64  har *)pPg;..#ifd
66f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6700: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6710: 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  NT.  assert(pLin
6720: 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c  k==&pPg->free ||
6730: 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66   pLink==&pPg->gf
6740: 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ree);.  assert(p
6750: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6760: 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c  e || pList!=&sql
6770: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29  ite3LruPageList)
6780: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
6790: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
67a0: 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  st ){.    pList-
67b0: 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d  >pFirst = pLink-
67c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
67d0: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c  ( pPg==pList->pL
67e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ast ){.    pList
67f0: 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d  ->pLast = pLink-
6800: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6810: 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29  ( pLink->pPrev )
6820: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
6830: 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20  nk *pPrevLink = 
6840: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6850: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
6860: 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20  pPrev)[iOff]);. 
6870: 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e     pPrevLink->pN
6880: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  ext = pLink->pNe
6890: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  xt;.  }.  if( pL
68a0: 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ink->pNext ){.  
68b0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
68c0: 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pNextLink = (Pag
68d0: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
68e0: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78  u8 *)pLink->pNex
68f0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
6900: 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  NextLink->pPrev 
6910: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6920: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
6930: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6940: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
6950: 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  *p = pLink->pNex
6960: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  t;.    while( p 
6970: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
6980: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c 72 75  {.      PagerLru
6990: 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65  Link *pL = (Page
69a0: 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75  rLruLink *)(&((u
69b0: 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20  8 *)p)[iOff]);. 
69c0: 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65       p = pL->pNe
69d0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
69e0: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
69f0: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c  d = p;.  }..  pL
6a00: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69  ink->pNext = pLi
6a10: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d  nk->pPrev = 0;.}
6a20: 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67  ../* .** Add pag
6a30: 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c 69 73  e pPg to the lis
6a40: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
6a50: 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 20 49  for the pager. I
6a60: 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e  f .** memory-man
6a70: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6a80: 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74 68 65  ed, also add the
6a90: 20 70 61 67 65 20 74 6f 20 74 68 65 20 67 6c 6f   page to the glo
6aa0: 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  bal .** list of 
6ab0: 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  free pages..*/.s
6ac0: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6ad0: 73 74 41 64 64 28 50 67 48 64 72 20 2a 70 50 67  stAdd(PgHdr *pPg
6ae0: 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26 70 50  ){.  listAdd(&pP
6af0: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6b00: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6b10: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6b20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6b30: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6b40: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6b50: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6b60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6b70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6b80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6b90: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6ba0: 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69 74 65   listAdd(&sqlite
6bb0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70  3LruPageList, &p
6bc0: 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b  Pg->gfree, pPg);
6bd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6be0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
6bf0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6c00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6c10: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6c20: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6c30: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6c40: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6c50: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6c60: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6c70: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6c80: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6c90: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6ca0: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6cb0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6cc0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6cd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6ce0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6cf0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6d00: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6d10: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6d20: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6d30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6d40: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6d50: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6d60: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6d70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6d80: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6d90: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6da0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6db0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d  U));.    listRem
6dc0: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6dd0: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6de0: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6df0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6e00: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
6e10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6e20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6e30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
6e40: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
6e50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6e60: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6e  just after the n
6e70: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73  eedSync flag has
6e80: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a   been cleared.**
6e90: 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20   from all pages 
6ea0: 6d 61 6e 61 67 65 64 20 62 79 20 70 50 61 67 65  managed by pPage
6eb0: 72 20 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75  r (usually becau
6ec0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
6ed0: 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20  ile.** has just 
6ee0: 62 65 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74  been synced). It
6ef0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 50 61   updates the pPa
6f00: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6f10: 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a  ynced variable.*
6f20: 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79  * and, if memory
6f30: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6f40: 6e 61 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69  nabled, the sqli
6f50: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6f60: 46 69 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76  FirstSynced.** v
6f70: 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f  ariable also..*/
6f80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6f90: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
6fa0: 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
6fb0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75  ){.  pPager->lru
6fc0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6fd0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6fe0: 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
6ff0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
7000: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
7010: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
7020: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
7030: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
7040: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
7050: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
7060: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
7070: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28  _LRU));.    for(
7080: 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  p=sqlite3LruPage
7090: 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26  List.pFirst; p &
70a0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70  & p->needSync; p
70b0: 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29  =p->gfree.pNext)
70c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d  ;.    assert(p==
70d0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
70e0: 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73  stSynced || p==s
70f0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
7100: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  t.pFirstSynced);
7110: 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50  .    sqlite3LruP
7120: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
7130: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71  nced = p;.    sq
7140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7150: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
7160: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
7170: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
7180: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
7190: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
71a0: 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68 61   if page *pPg ha
71b0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
71c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
71d0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e  atement.** journ
71e0: 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  al (or statement
71f0: 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65   snapshot has be
7200: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a  en created, if *
7210: 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f  pPg is part.** o
7220: 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  f an in-memory d
7230: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
7240: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74  tic int pageInSt
7250: 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70  atement(PgHdr *p
7260: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7270: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7280: 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  er;.  if( MEMDB 
7290: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47  ){.    return PG
72a0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
72b0: 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74   pPager)->inStmt
72c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
72d0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
72e0: 70 67 6e 6f 3b 0a 20 20 20 20 75 38 20 2a 61 20  pgno;.    u8 *a 
72f0: 3d 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  = pPager->aInStm
7300: 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  t;.    return (a
7310: 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
7320: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
7330: 26 26 20 28 61 5b 70 67 6e 6f 2f 38 5d 20 26 20  && (a[pgno/8] & 
7340: 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 29 3b  (1<<(pgno&7))));
7350: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
7360: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
7370: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20   the pager hash 
7380: 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d  table to N.  N m
7390: 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a  ust be a power.*
73a0: 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61  * of two..*/.sta
73b0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
73c0: 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
73d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
73e0: 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20  int N){.  PgHdr 
73f0: 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20  **aHash, *pPg;. 
7400: 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20   assert( N>0 && 
7410: 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a  (N&(N-1))==0 );.
7420: 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
7430: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  ger);.  sqlite3M
7440: 61 6c 6c 6f 63 42 65 6e 69 67 6e 46 61 69 6c 75  allocBenignFailu
7450: 72 65 28 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  re((int)pPager->
7460: 61 48 61 73 68 29 3b 0a 20 20 61 48 61 73 68 20  aHash);.  aHash 
7470: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
7480: 65 72 6f 28 20 73 69 7a 65 6f 66 28 61 48 61 73  ero( sizeof(aHas
7490: 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 70 61 67  h[0])*N );.  pag
74a0: 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
74b0: 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20  .  if( aHash==0 
74c0: 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72  ){.    /* Failur
74d0: 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e  e to rehash is n
74e0: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74  ot an error.  It
74f0: 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f   is only a perfo
7500: 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20  rmance hit. */. 
7510: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7520: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
7530: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
7540: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
7550: 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  N;.  pPager->aHa
7560: 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f  sh = aHash;.  fo
7570: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7580: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7590: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
75a0: 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20   int h;.    if( 
75b0: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
75c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
75d0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
75e0: 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
75f0: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  h==0 );.      co
7600: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
7610: 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20    h = pPg->pgno 
7620: 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67  & (N-1);.    pPg
7630: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48  ->pNextHash = aH
7640: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20  ash[h];.    if( 
7650: 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
7660: 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65    aHash[h]->pPre
7670: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
7680: 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20   }.    aHash[h] 
7690: 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e  = pPg;.    pPg->
76a0: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
76b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
76c0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
76d0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
76e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
76f0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
7700: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
7710: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
7720: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7730: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
7740: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
7750: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7760: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7770: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
7780: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
7790: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
77a0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
77b0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
77c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
77d0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
77e0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
77f0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
7800: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
7810: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
7820: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
7830: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
7840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7850: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
7860: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
7870: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7880: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
7890: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
78a0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
78b0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
78c0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
78d0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
78e0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
78f0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
7900: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
7910: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
7920: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
7930: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7940: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
7950: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
7960: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
7970: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7980: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
7990: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
79a0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
79b0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
79c0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
79d0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
79e0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
79f0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
7a00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
7a10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
7a20: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
7a30: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
7a40: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7a50: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
7a60: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
7a70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
7a80: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
7a90: 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74    if( !pFd->pMet
7aa0: 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75  hods ){.    retu
7ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7ac0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
7ad0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20  e3OsUnlock(pFd, 
7ae0: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
7af0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
7b00: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
7b10: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
7b20: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
7b30: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
7b40: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
7b50: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
7b60: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
7b70: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
7b80: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
7b90: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
7ba0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7bb0: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
7bc0: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
7bd0: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
7be0: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
7bf0: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
7c00: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7c10: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
7c20: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
7c30: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
7c40: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
7c50: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  size..**.** If t
7c60: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7c70: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
7c80: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
7c90: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
7ca0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
7cb0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
7cc0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7cd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
7ce0: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
7cf0: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
7d00: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
7d10: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
7d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
7d30: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
7d40: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
7d50: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
7d60: 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20  r){.  int dc;   
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
7d80: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
7d90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74  s */.  int nSect
7da0: 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74  or;      /* Sect
7db0: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  or size */.  int
7dc0: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f   nPage;        /
7dd0: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  * Page size */. 
7de0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7df0: 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
7e00: 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  .  if( fd->pMeth
7e10: 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20  ods ){.    dc = 
7e20: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
7e30: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66  haracteristics(f
7e40: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
7e50: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
7e60: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e  rSize(fd);.    n
7e70: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
7e80: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  ageSize;.  }..  
7e90: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
7ea0: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
7eb0: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65  512>>8));.  asse
7ec0: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7ed0: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
7ee0: 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21  6>>8));..  if( !
7ef0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20  fd->pMethods || 
7f00: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
7f10: 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e  P_ATOMIC|(nPage>
7f20: 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e  >8))&&nSector<=n
7f30: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Page) ){.    ret
7f40: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
7f50: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
7f60: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
7f70: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
7f80: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
7f90: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7fa0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
7fb0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
7fc0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
7fd0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
7fe0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
7ff0: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
8000: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
8010: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
8020: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
8030: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
8040: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
8050: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
8060: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
8070: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
8080: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
8090: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
80a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
80b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
80c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
80d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
80e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
80f0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
8100: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
8110: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c  s persistent. Al
8120: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  l subsequent API
8130: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
8140: 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d  ager.** will imm
8150: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
8160: 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
8170: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
8180: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
8190: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
81a0: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
81b0: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
81c0: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
81d0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
81e0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
81f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
8200: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
8210: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
8220: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
8230: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
8240: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
8250: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
8260: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
8270: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
8280: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
8290: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
82a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
82b0: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
82c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
82d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
82e0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
82f0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
8300: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
8310: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
8320: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
8330: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
8340: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
8350: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
8360: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
8370: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8380: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
8390: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
83a0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
83b0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
83c0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
83d0: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
83e0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
83f0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
8400: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
8410: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
8420: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
8430: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
8440: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
8450: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
8460: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
8470: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8480: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
8490: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
84a0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
84b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
84c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
84d0: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
84e0: 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f  ed char *)PGHDR_
84f0: 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b  TO_DATA(pPage));
8500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
8510: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
8520: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
8530: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
8540: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8550: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
8560: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
8570: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
8580: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
8590: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
85a0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
85b0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
85c0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
85d0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
85e0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
85f0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
8600: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
8610: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
8620: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
8630: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
8640: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
8650: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
8660: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
8670: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
8680: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
8690: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
86a0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
86b0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
86c0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
86d0: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
86e0: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
86f0: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
8700: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
8710: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
8720: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  dif../*.** When 
8730: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
8740: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8750: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
8760: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
8770: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
8780: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
8790: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
87a0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
87b0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
87c0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
87d0: 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  lied by the call
87e0: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  er. .**.** zMast
87f0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
8800: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
8810: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
8820: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
8830: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
8840: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
8850: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
8860: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
8870: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
8880: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
8890: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
88a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
88b0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
88c0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
88d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
88e0: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
88f0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
8900: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
8910: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
8920: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
8930: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
8940: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
8950: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
8960: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
8970: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
8980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8990: 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73   is present zMas
89a0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
89b0: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
89c0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
89d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
89e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
89f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
8a00: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
8a10: 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a  , int nMaster){.
8a20: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
8a30: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
8a40: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
8a50: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
8a60: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
8a70: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
8a80: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
8a90: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73  eader */..  zMas
8aa0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
8ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8ac0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
8ad0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
8ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
8af0: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
8b00: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
8b10: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
8b20: 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  16, &len);.  if(
8b30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8b40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
8b50: 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  f( len>=nMaster 
8b60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
8b80: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8b90: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
8ba0: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
8bb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8bc0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8bd0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
8be0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
8bf0: 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72   szJ-8);.  if( r
8c00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8c10: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
8c20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
8c30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8c40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8c50: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
8c60: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
8c70: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
8c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8ca0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
8cb0: 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65   '\0';..  /* See
8cc0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
8cd0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
8ce0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8cf0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8d00: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
8d10: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
8d20: 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20  [i];.   }.  if( 
8d30: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
8d40: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
8d50: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
8d60: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
8d70: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
8d80: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
8d90: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
8da0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
8db0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
8dc0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
8dd0: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
8de0: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
8df0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8e00: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
8e10: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
8e20: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
8e30: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
8e40: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8e50: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
8e60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8e70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
8e80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
8e90: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
8ea0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
8eb0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
8ec0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
8ed0: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
8ee0: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
8ef0: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
8f00: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
8f10: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
8f20: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
8f30: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
8f40: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
8f50: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
8f60: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
8f70: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8fa0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
8fb0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
8fc0: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
8fd0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
8fe0: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
8ff0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9000: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
9010: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
9020: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
9030: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
9040: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
9050: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
9060: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
9070: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9080: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
9090: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
90a0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
90b0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
90c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
90d0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
90e0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
90f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9100: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
9110: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
9120: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
9130: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
9140: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
9150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9160: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
9170: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
9180: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
9190: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
91a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
91b0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
91c0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
91d0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
91e0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
91f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
9200: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
9210: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
9220: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
9230: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9240: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
9250: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
9260: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
9270: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
9280: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
9290: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
92a0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
92b0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
92c0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
92d0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
92e0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
92f0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
9300: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
9310: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
9320: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9330: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
9340: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
9350: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
9360: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
9370: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
9380: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
9390: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
93a0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
93b0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
93c0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
93d0: 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48  ager){.  char zH
93e0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
93f0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b  urnalMagic)+16];
9400: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
9410: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
9420: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
9430: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
9440: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9450: 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73  nalOff;.  }..  s
9460: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
9470: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
9480: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
9490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
94a0: 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  ;..  memcpy(zHea
94b0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
94c0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
94d0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f  nalMagic));..  /
94e0: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
94f0: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
9500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
9510: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
9520: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
9530: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
9540: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
9550: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
9560: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
9570: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
9580: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
9590: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
95a0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
95b0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
95c0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
95d0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
95e0: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
95f0: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
9600: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
9610: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
9620: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
9630: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
9640: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
9650: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
9660: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
9670: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
9680: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
9690: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
96a0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
96b0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
96c0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
96d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
96e0: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
96f0: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
9700: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
9710: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
9720: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
9730: 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
9740: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
9750: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
9760: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
9770: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
9780: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
9790: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
97a0: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
97b0: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
97c0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
97d0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
97e0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
97f0: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
9800: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
9810: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
9820: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
9830: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
9840: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
9850: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
9860: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
9870: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
9880: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
9890: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
98a0: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
98b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
98c0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 70  .  */.  assert(p
98d0: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
98e0: 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53  ods||pPager->noS
98f0: 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70 50 61  ync);.  if( (pPa
9900: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a 20 20  ger->noSync) .  
9910: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
9920: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
9930: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
9940: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
9950: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
9960: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
9970: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9980: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
9990: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
99a0: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
99b0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
99c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
99d0: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
99e0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
99f0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
9a00: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
9a10: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
9a20: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
9a30: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
9a40: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
9a50: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9a60: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9a70: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
9a80: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
9a90: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
9aa0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
9ab0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
9ac0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9ad0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
9ae0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
9af0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
9b00: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
9b10: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
9b20: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
9b30: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9b40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
9b50: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
9b60: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
9b70: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
9b80: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
9b90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
9ba0: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
9bb0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
9bc0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9bd0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
9be0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
9bf0: 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  ,pPager->journal
9c00: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
9c10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
9c20: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9c30: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ger);..  /* The 
9c40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
9c50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
9c60: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
9c70: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
9c80: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
9c90: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
9ca0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9cb0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
9cc0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
9cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54  TE_OK ){.    IOT
9ce0: 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20  RACE(("JTAIL %p 
9cf0: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
9d00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9d10: 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d  Off-1)).    rc =
9d20: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9d30: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
9d40: 30 30 22 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e  00", 1, pPager->
9d50: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
9d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
9d80: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
9d90: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
9da0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
9db0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
9dc0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
9dd0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
9de0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
9df0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
9e00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
9e10: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
9e20: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
9e30: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
9e40: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
9e50: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
9e60: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9e70: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
9e80: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
9e90: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
9ea0: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
9eb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
9ec0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
9ed0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
9ee0: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
9ef0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
9f00: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
9f10: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
9f20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9f30: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
9f40: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
9f50: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
9f60: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
9f70: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
9f80: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
9f90: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9fa0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
9fb0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
9fc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9fd0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
9fe0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
9ff0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
a000: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
a010: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
a020: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
a030: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
a040: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
a050: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
a060: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
a070: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
a080: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
a090: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
a0a0: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
a0b0: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
a0c0: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
a0d0: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
a0e0: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
a0f0: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
a100: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
a110: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
a120: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
a130: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72  ader */.  i64 jr
a140: 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f  nlOff;..  seekJo
a150: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
a160: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
a170: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
a180: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a190: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
a1a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a1b0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
a1c0: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
a1d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
a1e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a1f0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
a200: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
a210: 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66  (aMagic), jrnlOf
a220: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  f);.  if( rc ) r
a230: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
a240: 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d  Off += sizeof(aM
a250: 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65  agic);..  if( me
a260: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
a270: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
a280: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
a290: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a2a0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
a2b0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
a2c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
a2d0: 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20  nlOff, pNRec);. 
a2e0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a2f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
a300: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a310: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20  jfd, jrnlOff+4, 
a320: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
a330: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
a340: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
a350: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a360: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
a370: 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a  ff+8, pDbSize);.
a380: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a390: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
a3a0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
a3b0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
a3c0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
a3d0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
a3e0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
a3f0: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
a400: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
a410: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
a420: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a430: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
a440: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
a450: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
a460: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
a470: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
a480: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
a490: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
a4a0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
a4b0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
a4c0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a4d0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
a4e0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
a4f0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a500: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32  jrnlOff+12, (u32
a510: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
a520: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
a530: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a540: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
a550: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
a560: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
a570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a580: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
a590: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
a5a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a5b0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
a5c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
a5d0: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
a5e0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
a5f0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
a600: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a610: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
a620: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
a630: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
a640: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
a650: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
a660: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
a670: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
a680: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
a690: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
a6a0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
a6b0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
a6c0: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
a6d0: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
a6e0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
a6f0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
a700: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
a710: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
a720: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
a730: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
a740: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
a750: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
a760: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
a770: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
a780: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
a790: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
a7a0: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
a7b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
a7c0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
a7d0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
a7e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
a7f0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
a800: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
a810: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
a820: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
a830: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
a840: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
a850: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
a860: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
a870: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
a880: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
a890: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
a8a0: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
a8b0: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
a8c0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
a8d0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
a8e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
a8f0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
a900: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
a910: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
a920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a930: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
a940: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
a950: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
a960: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
a970: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
a980: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
a990: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
a9a0: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
a9b0: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
a9c0: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
a9d0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
a9e0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
a9f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
aa00: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
aa10: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
aa20: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
aa30: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
aa40: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
aa50: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
aa60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
aa70: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65  lSync ){.    see
aa80: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
aa90: 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  er);.  }.  jrnlO
aaa0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
aab0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
aac0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
aad0: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
aae0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
aaf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
ab00: 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
ab10: 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  NO(pPager));.  i
ab20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ab30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ab40: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20  jrnlOff += 4;.. 
ab50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
ab60: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
ab70: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
ab80: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
ab90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
aba0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e  return rc;.  jrn
abb0: 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20  lOff += len;..  
abc0: 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20  put32bits(zBuf, 
abd0: 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74  len);.  put32bit
abe0: 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75  s(&zBuf[4], cksu
abf0: 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  m);.  memcpy(&zB
ac00: 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d  uf[8], aJournalM
ac10: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
ac20: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
ac30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ac40: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ac50: 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28   zBuf, 8+sizeof(
ac60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20  aJournalMagic), 
ac70: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67  jrnlOff);.  pPag
ac80: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
ac90: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
aca0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
acb0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
acc0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
acd0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
ace0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
acf0: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
ad00: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
ad10: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
ad20: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
ad30: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
ad40: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
ad50: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
ad60: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
ad70: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
ad80: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
ad90: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
ada0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
adb0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
adc0: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
add0: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
ade0: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
adf0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
ae00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
ae10: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
ae20: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
ae30: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
ae40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
ae50: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
ae60: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
ae70: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
ae80: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
ae90: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
aea0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
aeb0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
aec0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
aed0: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
aee0: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
aef0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
af00: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
af10: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
af20: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
af30: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
af40: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
af50: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
af60: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
af70: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
af80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
af90: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
afa0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
afb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
afc0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
afd0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
afe0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
aff0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
b000: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b010: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
b020: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
b030: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b040: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b050: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b060: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
b070: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
b080: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
b090: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
b0a0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
b0b0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
b0c0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
b0d0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
b0e0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
b0f0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
b100: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
b110: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b120: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
b130: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
b140: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
b150: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
b160: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b170: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
b180: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  MDB ){.      osU
b190: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b1a0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
b1b0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b1c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
b1d0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b1e0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
b1f0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
b200: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
b210: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
b220: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
b230: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
b240: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
b250: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
b260: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
b270: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
b280: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
b290: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
b2a0: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
b2b0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b2c0: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
b2d0: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
b2e0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
b2f0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
b300: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
b310: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
b320: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
b330: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
b340: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
b350: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
b360: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
b370: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
b380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
b390: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
b3a0: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
b3b0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
b3c0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
b3d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
b3e0: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
b3f0: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
b400: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
b410: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
b420: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
b430: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
b440: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
b450: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
b460: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
b470: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
b480: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
b490: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
b4a0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
b4b0: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
b4c0: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
b4d0: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
b4e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
b4f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
b500: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
b510: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
b520: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
b530: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
b540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b550: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
b560: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
b570: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
b580: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b590: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
b5a0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
b5b0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
b5c0: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
b5d0: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
b5e0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b5f0: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
b600: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
b610: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
b620: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
b630: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
b640: 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74  All;.    lruList
b650: 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20  Remove(pPg);.   
b660: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
b670: 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  g->pData);.    s
b680: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
b690: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
b6a0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
b6b0: 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t==0);.  assert(
b6c0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b6d0: 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20  stSynced==0);.  
b6e0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b6f0: 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20  ru.pLast==0);.  
b700: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
b710: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
b720: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
b730: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
b740: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
b750: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
b760: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
b770: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
b780: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b790: 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ref = 0;.}../*.*
b7a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
b7b0: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
b7c0: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
b7d0: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
b7e0: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
b7f0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
b800: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
b810: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b820: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
b830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b840: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
b850: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
b860: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
b870: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
b880: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
b890: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
b8a0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
b8b0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
b8c0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
b8d0: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
b8e0: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
b8f0: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
b900: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
b910: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
b920: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
b930: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
b940: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
b950: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
b960: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
b970: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
b980: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
b990: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
b9a0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b9b0: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
b9c0: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
b9d0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
b9e0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
b9f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
ba00: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
ba10: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
ba20: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
ba30: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
ba40: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
ba50: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
ba60: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
ba70: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
ba80: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
ba90: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
baa0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
bab0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
bac0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
bad0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bae0: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
baf0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
bb00: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
bb10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
bb20: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
bb30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bb40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
bb50: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
bb60: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
bb70: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
bb80: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
bb90: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
bba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
bbb0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
bbc0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
bbd0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
bbe0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
bbf0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
bc00: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
bc10: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
bc20: 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
bc30: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
bc40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
bc50: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
bc60: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
bc70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
bc80: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bc90: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
bca0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bcb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
bcc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
bcd0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bce0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
bcf0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bd00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bd10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd20: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
bd30: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
bd40: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
bd50: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
bd60: 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67 65  ite3_free( pPage
bd70: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
bd80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
bd90: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
bda0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
bdb0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
bdc0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
bdd0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
bde0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
bdf0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
be00: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
be10: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
be20: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
be30: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
be40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
be50: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
be60: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
be70: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
be80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
be90: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
bea0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
beb0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
bec0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
bed0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
bee0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bef0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
bf00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
bf10: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
bf20: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
bf30: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
bf40: 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
bf50: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bf60: 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f  e ){.    rc2 = o
bf70: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
bf80: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
bf90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
bfa0: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
bfb0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
bfc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
bfd0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
bfe0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
bff0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
c000: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
c010: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
c020: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
c030: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
c040: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
c050: 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46  0;.  lruListSetF
c060: 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65  irstSynced(pPage
c070: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
c080: 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65  Size = -1;..  re
c090: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
c0a0: 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
c0b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
c0c0: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
c0d0: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
c0e0: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
c0f0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
c100: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
c110: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
c120: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
c130: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
c140: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
c150: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
c160: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
c170: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
c180: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
c190: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
c1a0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
c1b0: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
c1c0: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
c1d0: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
c1e0: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
c1f0: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
c200: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
c210: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
c220: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
c230: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
c240: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
c250: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
c260: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
c270: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
c280: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
c290: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
c2a0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
c2b0: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
c2c0: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
c2d0: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
c2e0: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
c2f0: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
c300: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
c310: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
c320: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
c330: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
c340: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
c350: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
c360: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
c370: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
c380: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
c390: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
c3a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
c3b0: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
c3c0: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
c3d0: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
c3e0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
c3f0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
c400: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
c410: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
c420: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
c430: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
c440: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
c450: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
c460: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
c470: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
c480: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
c490: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
c4a0: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
c4b0: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
c4c0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
c4d0: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
c4e0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
c4f0: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
c500: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
c510: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
c520: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
c530: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
c540: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
c550: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
c560: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
c570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
c580: 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  um;.}../* Forwar
c590: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
c5a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
c5b0: 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a  eClean(PgHdr*);.
c5c0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
c5d0: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74  ngle page from t
c5e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c5f0: 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64  opened on file d
c600: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64  escriptor.** jfd
c610: 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73  .  Playback this
c620: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   one page..**.**
c630: 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20   If useCksum==0 
c640: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f  it means this jo
c650: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75  urnal does not u
c660: 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43  se checksums.  C
c670: 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20  hecksums.** are 
c680: 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74  not used in stat
c690: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62  ement journals b
c6a0: 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74  ecause statement
c6b0: 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74   journals do not
c6c0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76  .** need to surv
c6d0: 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  ive power failur
c6e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
c6f0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
c700: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
c710: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73  er *pPager, .  s
c720: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
c730: 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a  ,.  i64 offset,.
c740: 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29    int useCksum.)
c750: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
c760: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
c770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c780: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
c790: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
c7a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
c7d0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
c7e0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
c7f0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
c800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
c810: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
c820: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
c830: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
c840: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
c850: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
c860: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
c870: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
c880: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
c890: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
c8a0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
c8b0: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
c8c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c8d0: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
c8e0: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
c8f0: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
c900: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
c910: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
c920: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
c930: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
c940: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
c950: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
c960: 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67  jfd, offset, &pg
c970: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
c980: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c990: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
c9a0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
c9b0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
c9c0: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
c9d0: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
c9e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c9f0: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
ca00: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
ca10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
ca20: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
ca30: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
ca40: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
ca50: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
ca60: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
ca70: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
ca80: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
ca90: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
caa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
cab0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
cac0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
cad0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
cae0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
caf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
cb00: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
cb10: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
cb20: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
cb30: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
cb40: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
cb50: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
cb60: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
cb70: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
cb80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
cb90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
cba0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
cbb0: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
cbc0: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
cbd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
cbe0: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
cbf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
cc00: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
cc10: 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  et+pPager->pageS
cc20: 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a  ize+4, &cksum);.
cc30: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
cc40: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
cc50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
cc60: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
cc70: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
cc80: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
cc90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
cca0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
ccb0: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
ccc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
ccd0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
cce0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
ccf0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
cd00: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
cd10: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
cd20: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
cd30: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
cd40: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
cd50: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
cd60: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
cd70: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
cd80: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
cd90: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
cda0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
cdb0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
cdc0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
cdd0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
cde0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
cdf0: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
ce00: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
ce10: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
ce20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
ce30: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
ce40: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
ce50: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
ce60: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
ce70: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
ce80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
ce90: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
cea0: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
ceb0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
cec0: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
ced0: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
cee0: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
cef0: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
cf00: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
cf10: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
cf20: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
cf30: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
cf40: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
cf50: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
cf60: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
cf70: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
cf80: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
cf90: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
cfa0: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
cfb0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
cfc0: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
cfd0: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
cfe0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
cff0: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
d000: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d010: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
d020: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
d030: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
d040: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
d050: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
d060: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
d070: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
d080: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
d090: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
d0a0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
d0b0: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
d0c0: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
d0d0: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
d0e0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
d0f0: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
d100: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
d110: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
d120: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
d130: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
d140: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
d150: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
d160: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
d170: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
d180: 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
d190: 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
d1a0: 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
d1b0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
d1c0: 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
d1d0: 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
d1e0: 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
d1f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
d200: 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
d210: 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
d220: 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
d230: 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
d240: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
d250: 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
d260: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
d270: 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
d280: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
d290: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d2a0: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
d2b0: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
d2c0: 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
d2d0: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
d2e0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
d2f0: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
d300: 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
d310: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
d320: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
d330: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
d340: 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
d350: 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
d360: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
d370: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a  edSync==0..  */.
d380: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
d390: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
d3a0: 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  o);.  PAGERTRACE
d3b0: 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  4("PLAYBACK %d p
d3c0: 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
d3d0: 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
d3e0: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
d3f0: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
d400: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
d410: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
d420: 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ta));.  if( pPag
d430: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d440: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70  _EXCLUSIVE && (p
d450: 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65  Pg==0 || pPg->ne
d460: 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20  edSync==0) ){.  
d470: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
d480: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
d490: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
d4a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d4b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
d4c0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
d4d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
d4e0: 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  et);.    if( pPg
d4f0: 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c   ){.      makeCl
d500: 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ean(pPg);.    }.
d510: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
d520: 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
d530: 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
d540: 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
d550: 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
d560: 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
d570: 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
d580: 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
d590: 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
d5a0: 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
d5b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
d5c0: 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
d5d0: 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
d5e0: 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
d5f0: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
d600: 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
d610: 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
d620: 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
d630: 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
d640: 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
d650: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
d660: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
d670: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  ata;.    /* asse
d680: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
d690: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
d6a0: 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61   ); */.    pData
d6b0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
d6c0: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
d6d0: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
d6e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d6f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
d700: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
d710: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
d720: 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61  einiter(pPg, pPa
d730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
d740: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
d750: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
d760: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
d770: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
d780: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
d790: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
d7a0: 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
d7b0: 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
d7c0: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
d7d0: 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
d7e0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
d7f0: 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
d800: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
d810: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
d820: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
d830: 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
d840: 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
d850: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
d860: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d870: 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
d880: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
d890: 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
d8a0: 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
d8b0: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
d8c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
d8e0: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
d8f0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
d900: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d910: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
d920: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
d930: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
d940: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d950: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
d960: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
d970: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d980: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
d990: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
d9a0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d9b0: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
d9c0: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
d9d0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
d9e0: 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
d9f0: 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
da00: 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
da10: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
da20: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
da30: 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
da40: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
da50: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
da60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
da70: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
da80: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
da90: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
daa0: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
dab0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
dac0: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
dad0: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
dae0: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
daf0: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
db00: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
db10: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
db20: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
db30: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
db40: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
db50: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
db60: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
db70: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
db80: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
db90: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
dba0: 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
dbb0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
dbc0: 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
dbd0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
dbe0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
dbf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
dc00: 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  aster;.  sqlite3
dc10: 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
dc20: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
dc30: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
dc40: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
dc50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
dc60: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
dc70: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
dc80: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
dc90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
dca0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
dcb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dcc0: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
dcd0: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
dce0: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
dcf0: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
dd00: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
dd10: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
dd20: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
dd30: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73  nce..  */.  pMas
dd40: 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  ter = (sqlite3_f
dd50: 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ile *)sqlite3_ma
dd60: 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46  lloc(pVfs->szOsF
dd70: 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
dd80: 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
dd90: 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
dda0: 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
ddb0: 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
ddc0: 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
ddd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
dde0: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
ddf0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
de00: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
de10: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
de20: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
de30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de40: 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
de50: 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
de60: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
de70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
de80: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
de90: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
dea0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63  _open = 1;..  rc
deb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
dec0: 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
ded0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
dee0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
def0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
df00: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
df10: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
df20: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
df30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
df40: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
df50: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74  0;.    int nMast
df60: 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e  erPtr = pPager->
df70: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
df80: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  +1;..    /* Load
df90: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
dfa0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
dfb0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
dfc0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
dfd0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
dfe0: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
dff0: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
e000: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
e010: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
e020: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
e030: 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  malloc(nMasterJo
e040: 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
e050: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  tr);.    if( !zM
e060: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
e070: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e080: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e090: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
e0a0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61  t;.    }.    zMa
e0b0: 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
e0c0: 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
e0d0: 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72  rJournal];.    r
e0e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e0f0: 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
e100: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
e110: 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
e120: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e130: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
e140: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
e150: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
e160: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
e170: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
e180: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
e190: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
e1a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
e1b0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
e1c0: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
e1d0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
e1e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
e1f0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
e200: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
e210: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
e220: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
e230: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
e240: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
e250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
e260: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
e270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
e280: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
e290: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
e2a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e2b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e2c0: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
e2d0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
e2e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
e2f0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
e300: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
e310: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e320: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
e330: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
e340: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
e350: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
e360: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e370: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
e380: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
e390: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
e3a0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
e3b0: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
e3c0: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
e3d0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
e3e0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
e3f0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
e400: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e410: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e420: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
e430: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
e440: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
e450: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
e460: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
e470: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
e480: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
e490: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
e4a0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
e4b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
e4c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e4d0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
e4e0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
e4f0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
e500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
e510: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
e520: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
e530: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
e540: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
e550: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e560: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
e570: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
e580: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
e590: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e5a0: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
e5b0: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
e5c0: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
e5d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e5e0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
e5f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
e600: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
e610: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
e620: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
e630: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
e640: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
e650: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
e660: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
e670: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
e680: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
e690: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
e6a0: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
e6b0: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
e6c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
e6d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e6e0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
e6f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e700: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
e710: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e720: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e730: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
e740: 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72  LUSIVE && pPager
e750: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
e760: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e770: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
e780: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
e790: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
e7a0: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
e7b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e7c0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
e7d0: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
e7e0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
e7f0: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
e800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
e810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e820: 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72  e sectorSize for
e830: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
e840: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74  ..**.** The sect
e850: 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c  or size is the l
e860: 61 72 67 65 72 20 6f 66 20 74 68 65 20 73 65 63  arger of the sec
e870: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
e880: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
e890: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e  sSectorSize() an
e8a0: 64 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a  d the pageSize..
e8b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e8c0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
e8d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
e8e0: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
e8f0: 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
e900: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
e910: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
e920: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
e930: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
e940: 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
e950: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
e960: 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
e970: 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
e980: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
e990: 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61  yet, in whcih ca
e9a0: 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
e9b0: 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
e9c0: 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
e9d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
e9e0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
e9f0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
ea00: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
ea10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
ea20: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70  er->sectorSize<p
ea30: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
ea40: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
ea50: 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67  ectorSize = pPag
ea60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
ea70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
ea80: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
ea90: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
eaa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
eab0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
eac0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
ead0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
eae0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
eaf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
eb00: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
eb10: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
eb20: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
eb30: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
eb40: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
eb50: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
eb60: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
eb70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
eb80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
eb90: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
eba0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
ebb0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
ebc0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
ebd0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
ebe0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
ebf0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
ec00: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
ec10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
ec20: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
ec30: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
ec40: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ec50: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
ec60: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
ec70: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
ec80: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
ec90: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
eca0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ecb0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
ecc0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
ecd0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
ece0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
ecf0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
ed00: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
ed10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ed20: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
ed30: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
ed40: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
ed50: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
ed60: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
ed70: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
ed80: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ed90: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
eda0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
edb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
edc0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
edd0: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
ede0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
edf0: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
ee00: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
ee10: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
ee20: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
ee30: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
ee40: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
ee50: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
ee60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
ee70: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
ee80: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
ee90: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
eea0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
eeb0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
eec0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
eed0: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
eee0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
eef0: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
ef00: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
ef10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
ef20: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
ef30: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
ef40: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
ef50: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
ef60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ef70: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
ef80: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
ef90: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
efa0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
efb0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
efc0: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
efd0: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
efe0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
eff0: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
f000: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
f010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
f020: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
f030: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
f040: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
f050: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
f060: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
f070: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
f080: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
f090: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
f0a0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
f0b0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
f0c0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
f0d0: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
f0e0: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
f0f0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
f100: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
f110: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
f120: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
f130: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
f140: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
f150: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
f160: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
f170: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
f180: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
f190: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
f1a0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
f1b0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
f1c0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
f1d0: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
f1e0: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
f1f0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
f200: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
f210: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
f220: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
f230: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
f240: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
f250: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
f260: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
f270: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
f280: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
f290: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
f2a0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
f2b0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
f2c0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
f2d0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
f2e0: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
f2f0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
f300: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
f310: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
f320: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
f330: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
f340: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
f350: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
f360: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
f370: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
f380: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
f390: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
f3a0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
f3b0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
f3c0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
f3d0: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
f3e0: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
f3f0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
f400: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
f410: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
f420: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
f430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
f440: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
f450: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
f460: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
f470: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
f480: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
f490: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
f4a0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
f4b0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
f4c0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
f4d0: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
f4e0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
f4f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
f500: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
f510: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
f520: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
f530: 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
f540: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f550: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
f560: 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f580: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
f590: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f5a0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
f5b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f5c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
f5d0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
f5e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
f5f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f600: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
f610: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
f620: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
f630: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f640: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
f650: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
f660: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f670: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
f680: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
f690: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
f6a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
f6b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
f6c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f6d0: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
f6e0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
f6f0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
f700: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
f710: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
f720: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
f730: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
f740: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
f750: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f760: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
f770: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
f780: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
f790: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f7a0: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
f7b0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
f7c0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
f7d0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
f7e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
f7f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
f800: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
f810: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
f820: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f830: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
f840: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
f850: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
f860: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
f870: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
f880: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
f890: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
f8a0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
f8b0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ck..  */.  zMast
f8c0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
f8d0: 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
f8e0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
f8f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
f900: 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
f910: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
f920: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  1);.  assert( rc
f930: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
f940: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f950: 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a 4d 61  E_OK .   || (zMa
f960: 73 74 65 72 5b 30 5d 20 26 26 20 21 73 71 6c 69  ster[0] && !sqli
f970: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
f980: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
f990: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
f9a0: 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73  ) .  ){.    zMas
f9b0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
f9c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
f9d0: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
f9e0: 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  K;.    goto end_
f9f0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
fa00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fa10: 66 66 20 3d 20 30 3b 0a 20 20 7a 4d 61 73 74 65  ff = 0;.  zMaste
fa20: 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  r = 0;..  /* Thi
fa30: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
fa40: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
fa50: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
fa60: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
fa90: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
faa0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
fab0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
fac0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
fad0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
fae0: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
faf0: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
fb00: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
fb10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
fb20: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
fb30: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
fb40: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
fb50: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
fb60: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
fb70: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
fb80: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
fb90: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
fba0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
fbb0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
fbc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
fbd0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
fbe0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
fbf0: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
fc00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fc10: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
fc20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
fc30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fc40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
fc50: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
fc60: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
fc70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
fc80: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
fc90: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
fca0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
fcb0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
fcc0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
fcd0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
fce0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
fcf0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
fd00: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
fd10: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
fd20: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
fd30: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
fd40: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
fd50: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
fd60: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
fd70: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
fd80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fd90: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
fda0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
fdb0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
fdc0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
fdd0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
fde0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
fdf0: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
fe00: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
fe10: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
fe20: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
fe30: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
fe40: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
fe50: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
fe60: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
fe70: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
fe80: 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
fe90: 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
fea0: 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
feb0: 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
fec0: 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
fed0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
fee0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
fef0: 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
ff00: 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
ff10: 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
ff20: 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
ff30: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ff40: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
ff50: 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
ff60: 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
ff70: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
ff80: 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
ff90: 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
ffa0: 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
ffb0: 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a  t #2565..    */.
ffc0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
ffd0: 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
ffe0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
fff0: 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
10000 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
10010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10020 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
10030 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
10040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
10050 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
10060 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
10070 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10080 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
10090 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
100a0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
100b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
100c0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
100d0 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20  o it's original 
100e0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
100f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
10100 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
10110 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
10120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
10130 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
10140 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
10150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
10170 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10190 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
101a0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
101b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
101c0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
101d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
101e0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
101f0 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
10200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
10210 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
10220 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
10230 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10240 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
10250 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10270 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10280 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
10290 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
102a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
102b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
102c0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
102d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
102e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10300 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
10310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10320 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
10330 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
10340 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
10350 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
10360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
10370 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
10380 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
10390 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
103a0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
103b0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
103c0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
103d0 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66  ame+1);.  }.  if
103e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
103f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
10400 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
10410 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
10420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10430 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
10440 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
10450 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
10460 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
10470 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
10480 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
10490 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
104a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
104b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
104c0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
104d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
104e0 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
104f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  , zMaster);.  }.
10500 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
10510 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
10520 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
10530 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
10540 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
10550 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
10560 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
10570 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
10580 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
10590 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
105a0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
105b0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
105c0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
105d0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
105e0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
105f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
10600 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
10610 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
10620 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
10630 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
10640 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
10650 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
10660 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
10670 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
10680 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
10690 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
106a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
106b0 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
106c0 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
106d0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
106e0 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
106f0 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
10700 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
10710 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
10720 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
10730 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
10740 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
10750 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
10760 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
10770 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
10780 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
10790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
107a0 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
107b0 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
107c0 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
107d0 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
107e0 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
107f0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
10800 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
10810 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
10820 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10830 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
10840 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
10850 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
10860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10870 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
10880 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108a0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
108b0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
108c0 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
108d0 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
108e0 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
108f0 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
10900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
10910 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10920 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
10930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10940 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
10960 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
10970 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
10980 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
10990 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
109a0 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
109b0 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
109c0 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
109d0 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
109e0 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
109f0 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
10a00 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
10a10 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
10a20 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
10a30 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
10a40 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
10a50 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
10a60 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
10a70 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
10a80 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
10a90 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10aa0 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
10ab0 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
10ac0 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
10ad0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
10ae0 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
10af0 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
10b00 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
10b10 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
10b20 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
10b30 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
10b40 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
10b50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
10b60 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
10b70 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
10b80 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
10b90 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
10ba0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
10bb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
10bc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
10bd0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
10be0 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
10bf0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
10c00 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
10c10 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
10c20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
10c30 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
10c40 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
10c50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10c60 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
10c70 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10c80 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
10c90 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
10ca0 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
10cb0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
10cc0 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
10cd0 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
10ce0 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
10cf0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
10d00 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
10d10 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
10d20 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
10d30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
10d40 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
10d50 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
10d60 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
10d70 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
10d80 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
10d90 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
10da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10db0 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
10dc0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
10dd0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
10de0 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
10df0 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
10e00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
10e10 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
10e20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
10e30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10e40 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
10e50 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
10e60 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
10e70 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
10e80 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
10e90 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
10ea0 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
10eb0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
10ec0 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
10ed0 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
10ee0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
10ef0 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
10f00 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
10f10 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
10f20 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10f30 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
10f40 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
10f50 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
10f60 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
10f70 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
10f80 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
10f90 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
10fa0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
10fb0 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
10fc0 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
10fd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10fe0 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
10ff0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11000 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11010 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11020 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11030 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11040 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11050 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
11060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11070 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
11080 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
11090 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
110a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
110b0 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
110c0 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
110d0 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
110e0 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
110f0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
11100 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
11110 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
11120 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
11130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11150 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11160 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
11170 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
11180 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
11190 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
111a0 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
111b0 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
111c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
111d0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
111e0 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
111f0 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
11200 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
11210 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
11220 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
11230 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
11240 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
11250 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
11260 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11270 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
11280 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11290 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
112a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
112b0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
112c0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
112d0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
112e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
112f0 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
11300 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
11310 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
11320 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11330 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
11340 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
11350 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
11360 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
11370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
11380 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
11390 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
113a0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
113b0 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
113c0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
113d0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
113e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
113f0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
11400 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
11410 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
11420 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
11430 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
11440 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
11450 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
11460 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
11470 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
11480 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11490 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
114a0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
114b0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
114c0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
114d0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
114e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
114f0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
11500 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
11510 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
11520 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
11530 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
11540 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11550 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
11560 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
11570 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
11580 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
11590 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
115a0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
115b0 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
115c0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
115d0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
115e0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
115f0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
11600 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
11610 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
11620 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
11630 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
11640 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
11650 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
11670 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
11680 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
11690 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
116a0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
116b0 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
116c0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
116d0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
116e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
116f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
11700 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
11710 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
11720 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
11730 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
11740 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
11750 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
11770 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
11780 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
11790 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
117a0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
117b0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
117c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
117d0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
117e0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
117f0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
11800 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
11810 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
11820 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
11830 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
11840 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
11850 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
11860 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
11880 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
11890 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
118a0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
118b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
118c0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
118d0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
118e0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
118f0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
11900 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
11910 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
11920 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
11930 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
11940 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
11950 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
11960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11970 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
11980 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11990 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
119a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
119b0 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
119c0 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
119d0 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
119e0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
119f0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
11a00 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
11a10 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
11a20 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
11a30 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
11a40 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51  = (full_fsync?SQ
11a50 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
11a60 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
11a70 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
11a80 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
11a90 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
11aa0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
11ab0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
11ac0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
11ad0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
11ae0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
11af0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
11b00 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
11b10 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
11b20 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
11b30 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
11b40 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
11b50 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
11b60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
11b70 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
11b80 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
11b90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
11ba0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
11bb0 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
11bc0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11bd0 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
11be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
11bf0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
11c00 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
11c10 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
11c20 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
11c30 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11c40 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
11c50 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
11c60 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73   is closed..*/.s
11c70 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
11c80 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a  3PagerOpentemp(.
11c90 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
11ca0 56 66 73 2c 20 20 20 20 2f 2a 20 54 68 65 20 76  Vfs,    /* The v
11cb0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
11cc0 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20 20 73 71  em layer */.  sq
11cd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
11ce0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
11cf0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11d00 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20   here */.  char 
11d10 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
11d20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
11d30 66 69 6c 65 2e 20 20 4d 69 67 68 74 20 62 65 20  file.  Might be 
11d40 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 66  NULL */.  int vf
11d50 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
11d60 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
11d70 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
11d80 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
11d90 63 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  c;.  assert( zFi
11da0 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 0a 23 69  lename!=0 );..#i
11db0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11dc0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
11dd0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
11de0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
11df0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
11e00 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
11e10 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
11e20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11e30 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
11e40 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
11e50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11e60 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
11e70 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
11e80 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
11e90 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
11ea0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
11eb0 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
11ec0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
11ed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
11ee0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
11ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11f00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
11f10 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
11f20 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
11f30 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
11f40 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
11f50 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
11f60 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
11f70 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
11f80 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
11f90 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
11fa0 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
11fb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
11fc0 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
11fd0 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
11fe0 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
11ff0 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
12000 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12010 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
12020 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
12030 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
12040 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
12050 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
12060 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
12070 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
12080 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
12090 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
120a0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
120b0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
120c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
120d0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
120e0 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66  y:" then all inf
120f0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
12100 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74   in cache..** It
12110 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
12120 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73  n to disk.  This
12130 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
12140 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20  implement an.** 
12150 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
12160 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
12170 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
12180 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12190 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
121a0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
121b0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
121c0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
121d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
121e0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
121f0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
12200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
12210 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
12220 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12230 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
12240 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
12250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
12260 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
12270 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
12280 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
12290 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
122a0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
122b0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
122c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
122d0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
122e0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
122f0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
12300 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
12310 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  () */.){.  u8 *p
12320 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
12330 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ager = 0;.  int 
12340 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12350 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
12360 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
12370 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
12380 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
12390 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
123a0 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
123b0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
123c0 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
123d0 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
123e0 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
123f0 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a  OCK)!=0;.  int j
12400 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
12410 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
12420 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69 6e 74  ize(pVfs);.  int
12430 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
12440 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
12450 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72  AGE_SIZE;.  char
12460 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69   *zPathname;.  i
12470 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a 0a 20  nt nPathname;.. 
12480 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
12490 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c  return is a NULL
124a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70   pointer */.  *p
124b0 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
124c0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 75  * Compute the fu
124d0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ll pathname */. 
124e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
124f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12500 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  zPathname = s
12510 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50  qlite3_malloc(nP
12520 61 74 68 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  athname);.  if( 
12530 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
12540 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12550 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
12560 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
12570 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
12580 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12590 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
125a0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
125b0 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
125c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
125d0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
125e0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
125f0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
12600 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  f.    {.      rc
12610 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
12620 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
12630 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
12640 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
12650 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12670 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  OsGetTempname(pV
12680 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  fs, nPathname, z
12690 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
126a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
126b0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
126c0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
126d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
126e0 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d  ;.  }.  nPathnam
126f0 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68  e = strlen(zPath
12700 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  name);..  /* All
12710 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
12720 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
12730 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65 72  ture */.  pPager
12740 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12750 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66  Zero(.    sizeof
12760 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20 20  (*pPager) +     
12770 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
12780 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
12790 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
127a0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  +           /* T
127b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
127c0 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20  structure */ .  
127d0 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65    pVfs->szOsFile
127e0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 2f 2a   * 2 +        /*
127f0 20 54 68 65 20 64 62 20 61 6e 64 20 73 74 6d 74   The db and stmt
12800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
12810 2f 20 0a 20 20 20 20 34 2a 6e 50 61 74 68 6e 61  / .    4*nPathna
12820 6d 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20  me + 40         
12830 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c     /* zFilename,
12840 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f   zDirectory, zJo
12850 75 72 6e 61 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c  urnal, zStmtJrnl
12860 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21   */.  );.  if( !
12870 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71  pPager ){.    sq
12880 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
12890 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
128a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
128b0 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38    }.  pPtr = (u8
128c0 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
128d0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
128e0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20  s = vfsFlags;.  
128f0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71  pPager->fd = (sq
12900 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
12910 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
12920 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  *0];.  pPager->s
12930 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  tfd = (sqlite3_f
12940 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
12950 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20  >szOsFile*1];.  
12960 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73  pPager->jfd = (s
12970 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
12980 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
12990 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*2];.  pPager->
129a0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
129b0 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  r*)&pPtr[pVfs->s
129c0 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61  zOsFile*2+journa
129d0 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
129e0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
129f0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
12a00 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
12a10 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
12a20 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
12a30 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61  ->zDirectory[nPa
12a40 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
12a50 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d  ger->zStmtJrnl =
12a60 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
12a70 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30 5d  al[nPathname+10]
12a80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  ;.  pPager->pVfs
12a90 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63 70   = pVfs;.  memcp
12aa0 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
12ab0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
12ac0 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
12ad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
12ae0 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f  thname);..  /* O
12af0 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
12b00 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
12b10 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
12b20 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
12b30 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50  Db ){.    if( nP
12b40 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d  athname>(pVfs->m
12b50 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65  xPathname - size
12b60 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20  of("-journal")) 
12b70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
12b80 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
12b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ba0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
12bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12bc0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
12bd0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
12be0 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20  pPager->fd,.    
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
12c10 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
12c20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20       readOnly = 
12c30 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
12c40 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
12c50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
12c60 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
12c70 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
12c80 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
12c90 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ,.      ** choos
12ca0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
12cb0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
12cc0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
12cd0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
12ce0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
12cf0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
12d00 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
12d10 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   of:.      **.  
12d20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
12d30 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
12d40 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20  SIZE,.      **  
12d50 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
12d60 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
12d70 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
12d80 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
12d90 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
12da0 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
12db0 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
12dc0 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
12dd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12de0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
12df0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
12e00 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73   iSectorSize = s
12e10 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
12e20 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
12e30 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
12e40 61 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72  aultPage<iSector
12e50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
12e60 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
12e70 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
12e80 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
12e90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
12ea0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
12eb0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
12ec0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
12ed0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
12ee0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
12ef0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  d);.          in
12f00 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
12f10 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
12f20 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
12f30 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
12f40 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
12f50 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
12f60 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
12f70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
12f80 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
12f90 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
12fa0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
12fb0 20 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74   for(ii=nDefault
12fc0 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Page; ii<=SQLITE
12fd0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
12fe0 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
12ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
13000 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
13010 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
13020 38 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61  8)) ) nDefaultPa
13030 67 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  ge = ii;.       
13040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
13050 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
13060 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53  ( nDefaultPage>S
13070 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
13080 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
13090 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c           nDefaul
130a0 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d  tPage = SQLITE_M
130b0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
130c0 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
130d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
130e0 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62  }else if( !memDb
130f0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
13100 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
13110 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
13120 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
13130 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
13140 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
13150 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
13160 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
13170 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
13180 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
13190 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
131a0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
131b0 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
131c0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
131d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
131e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
131f0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
13200 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
13210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13220 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
13230 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20  mpSpace = (char 
13240 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
13250 28 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a  (nDefaultPage);.
13260 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
13270 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
13280 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
13290 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a  locks above..  *
132a0 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72  * Free the Pager
132b0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
132c0 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
132d0 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61   ** Since the pa
132e0 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
132f0 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
13300 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
13310 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
13320 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
13330 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
13340 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  er || !pPager->p
13350 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
13360 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13370 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13380 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
13390 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
133a0 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
133b0 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
133c0 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
133d0 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
133e0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
133f0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
13400 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13410 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
13420 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
13430 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
13440 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f  zFilename))..  /
13450 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
13460 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a  zDirectory[] */.
13470 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
13480 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61  >zDirectory, pPa
13490 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
134a0 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
134b0 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61  for(i=strlen(pPa
134c0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
134d0 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
134e0 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
134f0 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
13500 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
13510 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
13520 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ] = 0;..  /* Fil
13530 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72  l in Pager.zJour
13540 6e 61 6c 5b 5d 20 61 6e 64 20 50 61 67 65 72 2e  nal[] and Pager.
13550 7a 53 74 6d 74 4a 72 6e 6c 5b 5d 20 2a 2f 0a 20  zStmtJrnl[] */. 
13560 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13570 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
13580 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
13590 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70  thname);.  memcp
135a0 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
135b0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
135c0 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a  "-journal", 9);.
135d0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
135e0 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20 70 50 61 67  >zStmtJrnl, pPag
135f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
13600 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d  Pathname);.  mem
13610 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 53 74  cpy(&pPager->zSt
13620 6d 74 4a 72 6e 6c 5b 6e 50 61 74 68 6e 61 6d 65  mtJrnl[nPathname
13630 5d 2c 20 22 2d 73 74 6d 74 6a 72 6e 6c 22 2c 20  ], "-stmtjrnl", 
13640 31 30 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  10);..  /* pPage
13650 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
13660 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
13670 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
13680 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
13690 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
136a0 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
136b0 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
136c0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
136d0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
136e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
136f0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
13700 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
13710 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
13720 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
13730 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
13740 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61  pageSize = nDefa
13750 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50  ultPage;.  /* pP
13760 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
13770 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
13780 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
13790 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
137a0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
137b0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
137c0 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
137d0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
137e0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
137f0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
13800 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
13810 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
13820 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13830 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
13840 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
13850 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
13860 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
13870 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
13880 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
13890 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
138a0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
138b0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
138c0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
138d0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
138e0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
138f0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
13900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
13910 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
13920 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
13930 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
13940 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
13950 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
13960 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
13970 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
13980 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
13990 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
139a0 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
139b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
139c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
139d0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
139e0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
139f0 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
13a00 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
13a10 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
13a20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
13a30 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
13a40 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
13a50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
13a60 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
13a70 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
13a80 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
13a90 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
13aa0 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
13ab0 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
13ac0 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
13ad0 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
13ae0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
13af0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
13b00 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
13b10 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
13b20 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
13b30 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
13b40 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
13b50 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
13b60 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
13b70 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
13b80 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
13b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
13ba0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
13bb0 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
13bc0 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
13bd0 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
13be0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
13bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13c00 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
13c10 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
13c20 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13c30 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71  IC_MEM2);.    sq
13c40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13c50 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50  r(mutex);.    pP
13c60 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71  ager->pNext = sq
13c70 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a  lite3PagerList;.
13c80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
13c90 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  agerList ){.    
13ca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13cb0 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65  3PagerList->pPre
13cc0 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  v==0 );.      sq
13cd0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e  lite3PagerList->
13ce0 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a  pPrev = pPager;.
13cf0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13d00 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
13d10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
13d20 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  t = pPager;.    
13d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13d40 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
13d50 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
13d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13d70 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
13d80 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
13d90 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
13da0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
13db0 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
13dc0 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
13dd0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
13de0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
13df0 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
13e00 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
13e10 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
13e20 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
13e30 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
13e40 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
13e50 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
13e60 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
13e70 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
13e80 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
13e90 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
13ea0 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
13eb0 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
13ec0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
13ed0 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
13ee0 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
13ef0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
13f00 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
13f10 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
13f20 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  ult sqlite3Pager
13f30 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  Close().  .** De
13f40 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
13f50 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
13f60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
13f70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13f80 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63  3PagerSetDestruc
13f90 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
13fa0 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
13fb0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
13fc0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
13fd0 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
13fe0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
13ff0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
14000 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
14010 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
14020 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
14030 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
14040 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
14050 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
14060 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
14070 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
14080 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
14090 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
140a0 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
140b0 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
140c0 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
140d0 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
140e0 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
140f0 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
14100 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
14110 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
14120 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14130 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
14140 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
14150 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
14160 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
14170 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
14180 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
14190 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
141a0 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
141b0 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
141c0 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
141d0 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
141e0 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
141f0 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
14200 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
14210 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
14220 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
14230 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14240 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
14250 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
14260 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
14270 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14280 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  K;.  u16 pageSiz
14290 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
142a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
142b0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
142c0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
142d0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
142e0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
142f0 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
14300 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
14310 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26  ->pageSize .   &
14320 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
14330 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
14340 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0 .  ){.    ch
14350 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
14360 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
14370 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
14380 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
14390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
143a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
143b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74  {.      pagerEnt
143c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
143d0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
143e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
143f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
14400 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
14410 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14420 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
14430 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
14440 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
14450 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
14460 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
14470 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
14480 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14490 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  }.  *pPageSize =
144a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
144b0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
144c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
144d0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
144e0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
144f0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
14500 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
14510 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
14520 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
14530 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
14540 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
14550 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
14560 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
14570 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
14580 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14590 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
145a0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
145b0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
145c0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
145d0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
145e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
145f0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
14600 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
14610 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
14620 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
14630 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
14640 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
14650 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14660 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14670 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
14680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14690 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
146a0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
146b0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
146c0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
146d0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
146e0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
146f0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
14700 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
14710 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
14720 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
14730 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
14740 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
14750 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
14760 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
14770 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
14780 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
14790 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
147a0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
147b0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
147c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
147d0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
147e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
147f0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
14800 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
14810 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
14820 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
14830 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
14840 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
14850 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
14860 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
14870 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
14880 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
14890 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
148a0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
148b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
148c0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
148d0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
148e0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
148f0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
14900 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
14910 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
14920 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
14930 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
14940 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
14950 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
14960 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
14970 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
14980 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
14990 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
149a0 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
149b0 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
149c0 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
149d0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
149e0 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
149f0 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
14a00 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
14a10 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
14a20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
14a30 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
14a40 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
14a50 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
14a60 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
14a70 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
14a80 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
14a90 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
14aa0 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
14ab0 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
14ac0 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
14ad0 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
14ae0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
14af0 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
14b00 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
14b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14b20 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
14b30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
14b40 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
14b50 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
14b60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14b70 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
14b80 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
14b90 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
14ba0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
14bb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14bc0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14bd0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
14be0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
14bf0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
14c00 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
14c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
14c20 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
14c30 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
14c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14c50 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
14c60 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
14c70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14ca0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
14cb0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14cc0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
14cd0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
14ce0 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
14cf0 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
14d00 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
14d10 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
14d20 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
14d30 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
14d40 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
14d50 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
14d60 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
14d70 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
14d80 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
14d90 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
14da0 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
14db0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
14dc0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
14dd0 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
14de0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
14df0 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
14e00 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
14e10 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
14e20 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
14e30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
14e40 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
14e50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14e60 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
14e70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14e80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
14e90 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
14ea0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
14eb0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
14ec0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
14ed0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
14ee0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14ef0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
14f00 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
14f10 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
14f20 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
14f30 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
14f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f50 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
14f60 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
14f70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14f80 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
14f90 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
14fa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
14fb0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
14fc0 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
14fd0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
14fe0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
14ff0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15000 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
15010 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15020 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
15030 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
15040 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
15050 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
15060 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
15070 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
15080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
15090 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
150a0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
150b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
150c0 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
150d0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
150e0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
150f0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
15100 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
15110 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
15120 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
15130 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
15140 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
15150 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
15160 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
15170 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
15180 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
15190 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
151a0 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
151b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
151c0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
151d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
151e0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
151f0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
15200 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
15210 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15220 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
15230 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
15240 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
15250 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
15260 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
15270 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
15280 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
15290 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
152a0 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
152b0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
152c0 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
152d0 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
152e0 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
152f0 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
15300 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
15310 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
15320 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
15330 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
15340 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
15350 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
15360 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
15370 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
15380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15390 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
153a0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
153b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
153c0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
153d0 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
153e0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
153f0 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
15400 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
15410 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
15420 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
15430 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
15440 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
15450 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
15460 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
15470 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
15480 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
15490 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
154a0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
154b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
154c0 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
154d0 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
154e0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
154f0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
15500 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
15510 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
15520 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
15530 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
15540 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
15550 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
15560 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
15570 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
15580 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
15590 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
155a0 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
155b0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
155c0 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
155d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
155e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
155f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
15600 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72  * Unlink from fr
15610 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ee page list */.
15620 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
15630 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  pPg);..  /* Unli
15640 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
15650 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
15660 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
15670 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
15680 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15690 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
156a0 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
156b0 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
156c0 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
156d0 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
156e0 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
156f0 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
15700 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
15710 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
15720 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
15730 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
15740 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
15750 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
15760 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
15770 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
15780 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
15790 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
157a0 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
157b0 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
157c0 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
157d0 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
157e0 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
157f0 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
15800 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
15810 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
15820 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
15830 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
15840 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
15850 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
15860 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
15870 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
15880 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
15890 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
158a0 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
158b0 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
158c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
158d0 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
158e0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
158f0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
15900 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
15910 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
15920 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
15930 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
15940 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
15950 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
15960 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
15970 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
15980 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
15990 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
159a0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
159b0 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
159c0 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
159d0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
159e0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
159f0 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
15a00 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
15a10 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
15a20 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
15a30 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
15a40 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
15a50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
15a60 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
15a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15a80 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  ee(pPg->pData);.
15a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15aa0 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
15ab0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
15ac0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15ad0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
15ae0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
15af0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
15b00 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
15b10 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
15b20 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
15b30 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
15b40 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
15b50 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
15b60 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
15b70 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
15b80 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
15b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15ba0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
15bb0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
15bc0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
15bd0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
15be0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
15bf0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
15c00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
15c10 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
15c20 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
15c30 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
15c40 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
15c50 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
15c60 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
15c70 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
15c80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
15c90 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
15ca0 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
15cb0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
15cc0 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
15cd0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
15ce0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
15cf0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
15d00 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
15d10 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
15d20 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
15d30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15d40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15d50 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
15d60 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
15d70 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
15d80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
15d90 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
15da0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
15db0 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
15dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15dd0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
15de0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
15df0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
15e00 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
15e10 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
15e20 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
15e30 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
15e40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15e60 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
15e70 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
15e80 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
15e90 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15ea0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
15eb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15ed0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
15ee0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15ef0 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
15f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15f10 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
15f20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
15f30 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
15f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15f50 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15f60 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
15f70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
15f80 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
15f90 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
15fa0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
15fb0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
15fc0 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
15fd0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
15fe0 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
15ff0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
16000 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
16020 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16030 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16040 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
16050 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
16060 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
16070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16080 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
16090 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
160a0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
160b0 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
160c0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
160d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
160e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
160f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
16100 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16110 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16120 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
16130 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
16140 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
16150 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
16160 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
16170 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
16180 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
16190 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
161a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
161b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
161c0 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
161d0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
161e0 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
161f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
16200 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
16210 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
16220 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
16230 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
16240 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
16250 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
16260 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
16270 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
16280 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
16290 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
162a0 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
162b0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
162c0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
162d0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
162e0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
162f0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
16300 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
16310 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
16320 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
16330 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
16340 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
16350 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
16360 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
16370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
16380 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
16390 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
163a0 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
163b0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
163c0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
163d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
163e0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
163f0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
16400 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
16410 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
16420 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
16430 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
16440 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
16450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16460 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
16470 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
16480 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16490 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
164a0 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
164b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
164c0 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c  tex *mutex = sql
164d0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
164e0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
164f0 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
16500 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16510 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
16520 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65  if( pPager->pPre
16530 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  v ){.      pPage
16540 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
16550 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
16560 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16570 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
16580 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  st = pPager->pNe
16590 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
165a0 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20  ( pPager->pNext 
165b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
165c0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
165d0 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20  pPager->pPrev;. 
165e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
165f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
16600 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
16610 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
16620 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
16630 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
16640 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
16650 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
16660 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
16670 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
16680 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
16690 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
166a0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
166b0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
166c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
166d0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
166e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
166f0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
16700 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
16710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16720 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
16730 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16740 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
16750 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
16760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
16770 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
16780 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
16790 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
167a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
167b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
167c0 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
167d0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
167e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
167f0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
16800 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
16810 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
16820 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
16830 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
16840 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
16850 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
16860 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16870 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
16880 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
16890 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
168a0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
168b0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
168c0 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
168d0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
168e0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
168f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
16900 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
16910 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
16920 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16930 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
16940 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
16950 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
16960 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
16970 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
16980 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
16990 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
169a0 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
169b0 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  urn p->pgno;.}.#
169c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
169d0 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63   page_ref() func
169e0 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
169f0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
16a00 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a  unt for a page..
16a10 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69  ** If the page i
16a20 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
16a30 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
16a40 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16a50 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
16a60 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
16a70 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
16a80 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73  *.** For non-tes
16a90 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
16aa0 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f  ref() is a macro
16ab0 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67   that calls _pag
16ac0 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e  e_ref().** onlin
16ad0 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  e of the referen
16ae0 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
16af0 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74  .  For test syst
16b00 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a  ems, page_ref().
16b10 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e  ** is a real fun
16b20 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65  ction so that we
16b30 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f   can set breakpo
16b40 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69  ints and trace i
16b50 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
16b60 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
16b70 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
16b80 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
16b90 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
16ba0 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
16bb0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
16bc0 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
16bd0 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
16be0 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  g);.    pPg->pPa
16bf0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
16c00 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
16c10 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
16c20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16c30 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
16c40 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
16c50 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
16c60 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
16c70 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
16c80 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
16c90 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
16ca0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
16cb0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
16cc0 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
16cd0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
16ce0 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
16cf0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
16d00 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
16d10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
16d20 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
16d30 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
16d40 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
16d50 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
16d60 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
16d70 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
16d80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
16d90 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
16da0 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
16db0 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
16dc0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
16dd0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
16de0 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
16df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16e00 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
16e10 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
16e20 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
16e30 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
16e40 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
16e50 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
16e60 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
16e70 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
16e80 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
16e90 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
16ea0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
16eb0 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
16ec0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
16ed0 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
16ee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
16ef0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
16f00 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
16f10 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
16f20 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
16f30 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
16f40 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
16f50 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
16f60 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
16f70 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
16f80 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
16f90 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
16fa0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
16fb0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
16fc0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
16fd0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
16fe0 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
16ff0 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
17000 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
17010 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
17020 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
17030 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
17040 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
17050 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
17060 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
17070 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
17080 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
17090 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
170a0 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
170b0 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
170c0 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
170d0 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
170e0 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
170f0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
17100 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
17110 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
17120 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
17130 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
17140 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
17150 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
17160 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
17170 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
17180 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
17190 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
171a0 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
171b0 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
171c0 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
171d0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
171e0 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
171f0 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
17200 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
17210 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
17220 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
17230 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
17240 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
17250 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
17260 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
17270 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
17280 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
17290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
172a0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
172b0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
172c0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
172d0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
172e0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
172f0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
17300 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17310 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
17320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17330 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  OK;...  /* Sync 
17340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
17350 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
17360 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
17370 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
17380 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
17390 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
173a0 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
173b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
173c0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
173d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
173e0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  pFile ){.      i
173f0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
17400 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
17410 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
17420 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
17430 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
17440 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20  alOpen );..     
17450 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
17460 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
17470 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
17480 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
17490 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
174a0 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
174b0 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
174c0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
174d0 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
174e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
174f0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
17500 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
17510 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
17520 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
17530 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
17540 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
17550 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
17560 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
17570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
17580 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17590 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
175a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
175b0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
175c0 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
175d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
175e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
17610 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
17620 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
17630 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17640 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
17650 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
17660 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
17670 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
17680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
17690 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
176a0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
176b0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
176c0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
176d0 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
176e0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
176f0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
17700 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
17710 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
17720 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
17730 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
17740 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
17750 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
17760 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17770 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
17780 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
17790 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
177a0 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
177b0 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
177c0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
177d0 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
177e0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
177f0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
17800 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
17810 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
17820 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
17830 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
17840 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
17850 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
17860 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
17870 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
17880 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
17890 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
178a0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
178b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
178c0 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66        i64 jrnlOf
178d0 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  f;.        if( p
178e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
178f0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
17900 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
17910 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
17920 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
17930 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
17940 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17950 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
17960 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
17970 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
17980 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17990 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
179a0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
179b0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
179c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
179d0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
179e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
179f0 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
17a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17a10 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
17a20 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
17a30 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
17a40 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
17a50 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
17a60 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
17a70 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
17a80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
17a90 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
17aa0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
17ab0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17ad0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17ae0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17af0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
17b00 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
17b10 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
17b20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17b30 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
17b40 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
17b50 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
17b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17b70 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
17b80 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
17b90 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
17ba0 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
17bb0 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
17bc0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
17bd0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
17be0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17bf0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
17c00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17c10 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
17c20 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17c30 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
17c40 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
17c50 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
17c60 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
17c70 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
17c80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
17c90 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
17ca0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
17cb0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
17cc0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
17cd0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
17ce0 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72     lruListSetFir
17cf0 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
17d00 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
17d10 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
17d20 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
17d30 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
17d40 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
17d50 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
17d60 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
17d70 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
17d80 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
17d90 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
17da0 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
17db0 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
17dc0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
17dd0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
17de0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
17df0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
17e00 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
17e10 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17e20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
17e30 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
17e40 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b  r->lru.pFirst );
17e50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
17e60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17e70 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
17e80 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
17e90 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
17ea0 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
17eb0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
17ec0 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
17ed0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
17ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
17ef0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
17f00 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
17f10 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
17f20 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
17f30 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
17f40 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
17f50 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
17f60 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
17f70 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
17f80 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
17f90 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
17fa0 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
17fb0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
17fc0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
17fd0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
17fe0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
17ff0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
18000 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
18010 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
18020 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
18030 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
18040 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
18050 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
18070 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
18080 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
18090 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
180a0 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
180b0 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
180c0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
180d0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
180e0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
180f0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
18100 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
18110 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
18120 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
18130 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
18140 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18150 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
18160 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
18170 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
18180 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
18190 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
181a0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
181b0 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
181c0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
181d0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
181e0 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
181f0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
18200 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
18210 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
18220 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
18230 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
18240 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
18250 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
18260 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
18270 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
18280 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
18290 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
182a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
182b0 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
182c0 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
182d0 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
182e0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
182f0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
18300 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
18310 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
18320 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
18330 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
18340 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
18350 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18360 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
18370 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
18380 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
18390 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
183a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
183b0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
183c0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
183d0 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
183e0 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
183f0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
18400 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
18410 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
18420 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
18430 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
18440 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
18450 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
18460 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
18470 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
18480 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
18490 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
184a0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
184b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
184c0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
184d0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
184e0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
184f0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
18500 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
18510 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
18520 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
18530 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
18540 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18550 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
18560 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
18570 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
18580 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
18590 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
185a0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
185b0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
185c0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
185d0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
185e0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
185f0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
18600 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
18610 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
18620 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48  r *pPager;.  PgH
18630 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  dr *p;.  int rc;
18640 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
18650 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18660 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
18670 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
18680 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
18690 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
186a0 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
186b0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
186c0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
186d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
186e0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
186f0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
18700 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
18710 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
18720 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
18730 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
18740 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
18750 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
18760 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
18770 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
18780 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
18790 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
187a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
187b0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
187c0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
187d0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
187e0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
187f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18800 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
18810 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
18820 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
18830 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
18840 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
18850 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
18860 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
18870 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
18880 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
18890 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
188a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
188b0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
188c0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
188d0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
188e0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
188f0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
18900 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
18910 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
18920 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
18930 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
18940 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
18950 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
18960 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
18970 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
18980 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
18990 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
189a0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
189b0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
189c0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
189d0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
189e0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
189f0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
18a00 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
18a10 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
18a20 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
18a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18a50 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
18a60 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
18a70 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
18a80 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
18a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
18aa0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e  dirty );.    p->
18ab0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
18ac0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
18ad0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
18ae0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
18af0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
18b00 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
18b10 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
18b20 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
18b30 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
18b40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
18b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18b60 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
18b70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
18b80 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
18b90 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
18bc0 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
18bd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
18be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
18bf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
18c00 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
18c10 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
18c20 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
18c30 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
18c40 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
18c50 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
18c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
18c70 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
18c80 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
18c90 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
18ca0 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
18cb0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
18cc0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
18cd0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
18ce0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
18cf0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
18d00 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
18d10 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
18d20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
18d30 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
18d40 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
18d50 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
18d60 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
18d70 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
18d80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
18d90 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
18da0 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
18db0 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
18dc0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
18dd0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
18df0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
18e00 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
18e10 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
18e20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
18e30 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
18e40 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
18e50 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
18e60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
18e70 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
18e80 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
18e90 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
18ea0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
18eb0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
18ec0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
18ed0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
18ee0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
18ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
18f00 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
18f10 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
18f20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
18f30 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
18f40 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
18f50 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
18f60 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
18f70 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
18f80 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
18f90 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
18fa0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18fb0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
18fc0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
18fd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
18fe0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18ff0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
19000 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
19010 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
19020 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
19030 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
19040 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
19050 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
19060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
19080 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
19090 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
190a0 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
190b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
190c0 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
190d0 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
190e0 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
190f0 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
19100 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
19110 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
19120 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
19130 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
19140 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19150 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
19160 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
19170 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
19180 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
19190 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
191a0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
191b0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
191c0 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
191d0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
191e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
191f0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
19200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19210 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
19220 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
19230 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
19240 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
19250 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
19260 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
19270 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
19280 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
19290 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
192a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
192b0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
192c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
192d0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
192e0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
192f0 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  s;.  if( !pPager
19300 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
19310 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
19320 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
19330 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
19340 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
19350 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b  CCESS_EXISTS) ){
19360 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19370 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
19380 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
19390 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
193a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
193b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
193c0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
193d0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
193e0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
193f0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
19400 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
19410 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19420 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
19430 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
19440 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
19450 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
19460 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
19470 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
19480 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
19490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
194a0 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
194b0 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
194c0 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
194d0 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
194e0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
194f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19500 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
19510 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
19520 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
19530 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
19540 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  = 0;..  /* It is
19550 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
19560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
19570 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
19580 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e  object.  ** poin
19590 74 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72  ted to by pPager
195a0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   has at least on
195b0 65 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67  e free page (pag
195c0 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e  e with nRef==0).
195d0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
195e0 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72  !MEMDB);.  asser
195f0 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
19600 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  irst);..  /* Fin
19610 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
19620 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
19630 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
19640 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
19650 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
19660 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
19670 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
19680 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
19690 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  ru.pFirstSynced;
196a0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
196b0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
196c0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
196d0 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
196e0 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
196f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
19700 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
19710 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
19720 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
19730 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
19740 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
19750 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
19760 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
19770 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
19780 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
19790 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
197a0 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20  >lru.pFirst){.  
197b0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
197c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
197d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
197e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20  r->fd);.    int 
197f0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
19800 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
19810 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
19820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19830 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
19840 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
19850 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
19860 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
19870 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  ){.      /* If i
19880 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
19890 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f  , write a new jo
198a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74  urnal header int
198b0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  o the.      ** j
198c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
198d0 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
198e0 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
198f0 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
19900 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
19910 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
19920 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
19930 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
19940 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
19950 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
19960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
19970 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
19980 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  r is.      ** tr
19990 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
199a0 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
199b0 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  ated)..      */.
199c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
199d0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ec = 0;.      as
199e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
199f0 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a  urnalOff > 0 );.
19a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19a10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
19a20 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
19a30 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
19a40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
19a50 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
19a60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19a80 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
19a90 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  lru.pFirst;.  }.
19aa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
19ab0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
19ac0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
19ad0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19ae0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
19af0 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
19b00 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
19b10 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
19b20 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
19b30 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
19b40 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
19b50 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
19b60 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
19b70 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
19b80 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
19b90 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
19ba0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
19bb0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19bc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19bd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19be0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19bf0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
19c00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
19c10 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
19c20 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
19c30 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
19c40 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
19c50 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
19c60 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
19c70 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
19c80 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
19c90 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
19ca0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
19cb0 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
19cc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
19cd0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
19ce0 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
19cf0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
19d00 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
19d10 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
19d20 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
19d30 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
19d40 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
19d50 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
19d60 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
19d70 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
19d80 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
19d90 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
19da0 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
19db0 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
19dc0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
19dd0 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
19de0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
19df0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
19e00 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
19e10 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
19e20 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
19e30 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
19e40 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
19e50 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
19e60 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
19e70 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
19e80 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
19e90 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
19ea0 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72  ge(pPg);.  asser
19eb0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  t( pPg->pgno==0 
19ec0 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50  );..  *ppPg = pP
19ed0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
19ee0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
19ef0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
19f00 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
19f10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19f20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
19f30 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
19f40 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
19f50 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
19f60 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
19f70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
19f80 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
19f90 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
19fa0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
19fb0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
19fc0 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33  d may be sqlite3
19fd0 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  _free()ed..**.**
19fe0 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
19ff0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1a000 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
1a010 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
1a020 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
1a030 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
1a040 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20  on returns. The 
1a050 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a060 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1a070 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
1a080 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1a090 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a0a0 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f  PagerReleaseMemo
1a0b0 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
1a0c0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
1a0d0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  0;          /* B
1a0e0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
1a0f0 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a  eleased so far *
1a100 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1a110 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
1a120 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
1a130 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  x */.  Pager *pP
1a140 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
1a150 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1a160 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f  g over pagers */
1a170 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a180 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71  TE_OK;..  /* Acq
1a190 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d  uire the memory-
1a1a0 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65 78  management mutex
1a1b0 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20  .  */.  mutex = 
1a1c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1a1d0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1a1e0 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
1a1f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a200 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20  nter(mutex);..  
1a210 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61  /* Signal all da
1a220 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a230 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d  ns that memory m
1a240 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a  anagement wants.
1a250 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63    ** to have acc
1a260 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ess to the pager
1a270 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  s..  */.  for(pP
1a280 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65  ager=sqlite3Page
1a290 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70  rList; pPager; p
1a2a0 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
1a2b0 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65  ext){.     pPage
1a2c0 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b  r->iInUseMM = 1;
1a2d0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1a2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a2f0 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
1a300 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20  ased<nReq) ){.  
1a310 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1a320 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c    PgHdr *pRecycl
1a330 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79  ed;. .    /* Try
1a340 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1a350 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74 20  to recycle that 
1a360 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1a370 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20   a sync(). If.  
1a380 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74    ** this is not
1a390 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20   possible, find 
1a3a0 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72 65  one that does re
1a3b0 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a  quire a sync()..
1a3c0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1a3d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1a3e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1a3f0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1a400 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
1a410 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c    pPg = sqlite3L
1a420 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
1a430 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77 68 69  tSynced;.    whi
1a440 6c 65 28 20 70 50 67 20 26 26 20 28 70 50 67 2d  le( pPg && (pPg-
1a450 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1a460 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65  ->pPager->iInUse
1a470 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67  DB) ){.      pPg
1a480 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1a490 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1a4a0 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20 20 20  f( !pPg ){.     
1a4b0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72   pPg = sqlite3Lr
1a4c0 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
1a4d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
1a4e0 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61 67 65  Pg && pPg->pPage
1a4f0 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a 20  r->iInUseDB ){. 
1a500 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67         pPg = pPg
1a510 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20  ->gfree.pNext;. 
1a520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a540 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
1a550 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1a560 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1a570 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ));..    /* If p
1a580 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  Pg==0, then the 
1a590 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61 73 20  block above has 
1a5a0 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61  failed to find a
1a5b0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
1a5c0 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68 69 73  recycle. In this
1a5d0 20 63 61 73 65 20 72 65 74 75 72 6e 20 65 61 72   case return ear
1a5e0 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65 72 20  ly - no further 
1a5f0 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20 20  memory will.    
1a600 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
1a610 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1a620 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  pPg ) break;..  
1a630 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
1a640 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73 73 65  pPager;.    asse
1a650 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt(!pPg->needSyn
1a660 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72  c || pPg==pPager
1a670 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 20  ->lru.pFirst);. 
1a680 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e 6e     assert(pPg->n
1a690 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1a6a0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a6b0 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20 20  stSynced);.  .  
1a6c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1a6d0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1a6e0 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 61 73  ecycled);.    as
1a6f0 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1a700 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1a710 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1a720 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a730 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1a740 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1a750 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1a760 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1a770 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1a780 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1a790 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1a7a0 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1a7b0 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1a7c0 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1a7d0 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1a7e0 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1a7f0 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1a800 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1a810 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1a820 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1a830 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1a840 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1a850 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1a860 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1a870 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1a880 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1a890 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1a8a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1a8b0 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1a8c0 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1a8d0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1a8e0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1a8f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a900 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1a910 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1a920 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1a930 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1a940 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1a950 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1a960 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1a970 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1a980 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1a990 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1a9a0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1a9b0 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1a9c0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1a9d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1a9e0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1a9f0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1aa00 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1aa10 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1aa20 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1aa30 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1aa40 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1aa50 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1aa60 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1aa70 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1aa80 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1aa90 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1aaa0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1aab0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
1aac0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1aad0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1aae0 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1aaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1ab00 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1ab10 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1ab20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ab30 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1ab40 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1ab50 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1ab60 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1ab70 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1ab80 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1ab90 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1aba0 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1abb0 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1abc0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1abd0 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1abe0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1abf0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1ac00 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1ac10 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1ac20 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1ac30 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1ac40 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1ac50 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1ac60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1ac70 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1ac80 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1ac90 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1aca0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1acb0 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1acc0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1acd0 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1ace0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1acf0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1ad00 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1ad10 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1ad20 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1ad30 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1ad40 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1ad50 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1ad60 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1ad70 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1ad80 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1ad90 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1ada0 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1adb0 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1adc0 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1add0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1ade0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1adf0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1ae00 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ae10 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1ae20 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1ae30 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1ae40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1ae50 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1ae60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1ae70 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1ae80 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1ae90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1aea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1aeb0 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1aec0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1aed0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1aee0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1aef0 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1af00 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1af10 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1af20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1af30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1af40 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1af50 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1af60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1af70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1af80 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1af90 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1afa0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1afb0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1afc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1afd0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1afe0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1aff0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1b000 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1b010 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1b020 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1b030 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1b040 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1b050 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1b060 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1b070 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1b080 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1b090 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1b0a0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1b0b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1b0c0 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1b100 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1b110 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1b120 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1b130 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1b140 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1b150 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1b160 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1b170 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1b180 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1b190 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1b1a0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1b1b0 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1b1c0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1b1d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b1e0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1b1f0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1b200 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1b210 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1b220 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1b230 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1b240 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1b250 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1b260 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1b270 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1b280 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1b290 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1b2a0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1b2b0 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1b2c0 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1b2d0 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1b2e0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1b2f0 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1b300 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1b310 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1b320 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1b330 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1b340 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1b350 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1b360 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1b370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b380 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1b390 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1b3a0 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CK ){.    sqlite
1b3b0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1b3c0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1b3d0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1b3e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b3f0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1b400 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1b410 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1b420 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b430 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1b440 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1b450 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1b460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1b480 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1b490 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1b4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1b4b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b4c0 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1b4d0 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
1b4e0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
1b4f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1b500 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
1b510 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
1b520 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
1b530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1b540 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
1b550 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1b560 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
1b570 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1b580 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
1b590 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
1b5a0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
1b5b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b5c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b5d0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
1b5e0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
1b5f0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
1b600 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
1b610 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
1b620 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
1b630 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
1b640 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1b650 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
1b660 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
1b670 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
1b680 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1b690 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
1b6a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
1b6b0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
1b6c0 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
1b6d0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
1b6e0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
1b6f0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
1b700 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
1b710 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63   .        ** bac
1b720 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  k..        ** . 
1b730 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73         ** Becaus
1b740 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
1b750 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
1b760 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
1b770 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  d, the.        *
1b780 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
1b790 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
1b7a0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
1b7b0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
1b7c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69          ** obtai
1b7d0 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
1b7e0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1b7f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1b800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b820 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1b830 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1b840 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b860 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1b870 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1b880 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b890 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1b8a0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1b8b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1b8c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b8d0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20  R_EXCLUSIVE;. . 
1b8e0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1b8f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1b900 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
1b910 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1b920 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
1b930 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1b940 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1b950 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
1b960 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1b970 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1b980 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1b990 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
1b9a0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1b9b0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
1b9c0 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
1b9d0 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
1b9e0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
1b9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
1ba00 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
1ba10 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
1ba20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
1ba30 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
1ba40 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
1ba50 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
1ba60 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1ba70 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ba80 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20      ** Open the 
1ba90 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
1baa0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1bab0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
1bac0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
1bad0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1bae0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1baf0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1bb00 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1bb10 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
1bb20 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
1bb30 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
1bb40 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
1bb50 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
1bb60 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
1bb70 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
1bb80 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1bb90 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
1bba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
1bbb0 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
1bbc0 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
1bbd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1bbe0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1bbf0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
1bc00 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
1bc10 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
1bc20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bc30 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  STS) ){.        
1bc40 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
1bc50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c            int fl
1bc60 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1bc70 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1bc80 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1bc90 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
1bca0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1bcb0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1bcc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bcd0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1bce0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1bcf0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1bd00 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1bd10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bd20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1bd30 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1bd40 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
1bd50 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c      if( fout&SQL
1bd60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1bd70 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
1bd80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1bd90 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  Y;.            s
1bda0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1bdb0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
1bdc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bdd0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1bde0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bdf0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
1be00 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1be10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1be20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  (rc==SQLITE_NOME
1be30 4d 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59  M?rc:SQLITE_BUSY
1be40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1be50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1be60 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
1be70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1be80 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1be90 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1bea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1beb0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1bec0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1bed0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bee0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1bef0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
1bf00 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
1bf10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
1bf20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
1bf30 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
1bf40 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
1bf50 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1bf60 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
1bf70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1bf80 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1bf90 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
1bfa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bfb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1bfc0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1bfd0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1bfe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bff0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1c000 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1c010 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
1c020 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
1c030 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1c040 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
1c050 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
1c060 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
1c070 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c080 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1c090 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
1c0a0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
1c0b0 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
1c0c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1c0d0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
1c0e0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
1c0f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1c100 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
1c110 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ous.        ** r
1c120 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1c130 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
1c140 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1c150 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
1c160 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
1c170 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
1c180 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
1c190 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
1c1a0 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e         ** cache.
1c1b0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1c1c0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
1c1d0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
1c1e0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
1c1f0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
1c200 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ning.        ** 
1c210 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
1c220 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
1c230 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
1c240 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
1c250 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62         ** a 32-b
1c260 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
1c270 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1c280 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
1c290 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1c2a0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
1c2b0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
1c2c0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
1c2d0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ge when.        
1c2e0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
1c2f0 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   use..        **
1c300 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65   .        ** The
1c310 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1c320 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1c330 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1c340 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1c350 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1c360 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1c370 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1c380 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1c390 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1c3a0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
1c3b0 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cted..        */
1c3c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62  .        char db
1c3d0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
1c3e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c3f0 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  rs)];.        sq
1c400 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1c410 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  unt(pPager);..  
1c420 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1c430 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1c440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50         return pP
1c450 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c460 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1c470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1c480 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1c490 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1c4a0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1c4b0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1c4c0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1c4d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c4e0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1c4f0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1c500 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1c510 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1c520 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c570 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1c580 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1c590 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1c5a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1c5b0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1c5c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c5d0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1c5e0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1c5f0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1c600 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c640 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1c650 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1c660 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1c670 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1c680 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1c690 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1c6a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c6b0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1c6c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1c6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c6e0 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1c6f0 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1c700 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1c710 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1c720 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1c730 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1c740 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1c750 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1c760 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1c770 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1c780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1c790 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1c7a0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1c7b0 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1c7c0 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1c7d0 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1c7e0 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1c7f0 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1c800 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1c810 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1c820 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1c830 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1c840 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1c850 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1c860 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1c870 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1c880 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1c890 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1c8a0 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1c8b0 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1c8c0 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1c8d0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1c8e0 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1c8f0 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1c900 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1c910 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1c920 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1c930 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c940 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1c950 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1c960 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1c970 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1c980 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1c990 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1c9a0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1c9b0 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1c9c0 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1c9d0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1c9e0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1c9f0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1ca00 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1ca10 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1ca20 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1ca30 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1ca40 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1ca50 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1ca60 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1ca70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1ca80 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1ca90 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1caa0 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1cab0 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1cac0 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1cad0 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1cae0 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1caf0 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1cb00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1cb10 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1cb20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cb30 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1cb40 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1cb50 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1cb60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cb70 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1cb80 70 50 67 3b 0a 20 20 76 6f 69 64 20 2a 70 44 61  pPg;.  void *pDa
1cb90 74 61 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ta;..  /* Create
1cba0 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20   a new PgHdr if 
1cbb0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20  any of the four 
1cbc0 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e  conditions defin
1cbd0 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61  ed .  ** above a
1cbe0 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28  re met: */.  if(
1cbf0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
1cc00 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20  Pager->mxPage.  
1cc10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e   || pPager->lru.
1cc20 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c  pFirst==0 .   ||
1cc30 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50   MEMDB.   || (pP
1cc40 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1cc50 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
1cc60 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
1cc70 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
1cc80 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1cc90 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1cca0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1ccb0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1ccc0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1ccd0 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1cce0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1ccf0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1cd00 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1cd10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1cd20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1cd30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1cd40 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1cd50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cd60 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1cd70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 67 20  Pager);.    pPg 
1cd80 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1cd90 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
1cda0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1cdb0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
1cde0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
1cdf0 72 79 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ry) );.    if( p
1ce00 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  Pg ){.      pDat
1ce10 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  a = sqlite3_mall
1ce20 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  oc( pPager->page
1ce30 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1ce40 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ( pData==0 ){.  
1ce50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1ce60 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ee(pPg);.       
1ce70 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20   pPg = 0;.      
1ce80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
1ce90 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1cea0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
1ceb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1cec0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1ced0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
1cee0 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
1cef0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20      memset(pPg, 
1cf00 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29  0, sizeof(*pPg))
1cf10 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
1cf20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1cf30 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1cf40 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
1cf50 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
1cf60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
1cf70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
1cf80 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1cf90 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70   = pPager;.    p
1cfa0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
1cfb0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
1cfc0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1cfd0 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  pPg;.    pPager-
1cfe0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73  >nPage++;.  }els
1cff0 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
1d000 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
1d010 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
1d020 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
1d030 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
1d040 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  cle(pPager, &pPg
1d050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d060 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1d070 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d080 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
1d090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1d0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d0b0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1d0c0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1d0d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1d0e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1d0f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1d100 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
1d110 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  }.  *ppPg = pPg;
1d120 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  ..pager_allocate
1d130 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  _out:.  return r
1d140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1d150 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1d160 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1d170 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1d180 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1d190 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1d1a0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1d1b0 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1d1c0 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1d1d0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1d1e0 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1d1f0 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1d200 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1d210 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1d220 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1d230 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1d240 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1d250 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1d260 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1d270 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1d280 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1d290 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1d2a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1d2b0 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20  >needRead ){.   
1d2c0 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62   int rc = readDb
1d2d0 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72  Page(pPg->pPager
1d2e0 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f  , pPg, pPg->pgno
1d2f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d310 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1d320 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1d330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d340 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d360 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1d370 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1d380 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1d390 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1d3a0 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1d3b0 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1d3c0 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1d3d0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1d3e0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1d3f0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1d400 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1d410 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1d420 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1d430 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1d440 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1d450 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1d460 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1d470 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1d480 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1d490 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1d4a0 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1d4b0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1d4c0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1d4d0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1d4e0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1d4f0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1d500 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1d510 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1d520 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1d530 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1d540 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1d550 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1d560 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1d570 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1d580 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1d590 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1d5a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1d5b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1d5c0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1d5d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1d5e0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1d5f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1d600 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1d610 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1d620 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1d630 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1d640 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1d650 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1d660 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1d670 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1d680 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1d690 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1d6a0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1d6b0 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1d6c0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1d6d0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1d6e0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1d6f0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1d700 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1d710 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1d720 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1d730 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1d740 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1d750 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1d760 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1d770 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1d780 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1d790 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1d7a0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1d7b0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1d7c0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1d7d0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1d7e0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1d7f0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1d800 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1d810 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1d820 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1d830 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1d840 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1d850 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1d860 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1d870 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1d880 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1d890 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1d8a0 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1d8b0 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1d8c0 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1d8d0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1d8e0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1d8f0 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1d900 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1d910 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1d920 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1d930 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1d940 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1d950 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1d960 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1d970 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1d980 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1d990 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1d9a0 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1d9b0 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1d9c0 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1d9d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1d9e0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1d9f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1da00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1da10 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1da20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1da30 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1da40 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1da50 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1da60 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1da70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1da80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1da90 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1daa0 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1dab0 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1dac0 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1dad0 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1dae0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1daf0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1db00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1db10 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1db20 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
1db30 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1db40 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
1db50 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1db60 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1db70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1db80 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1db90 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1dba0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1dbb0 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1dbc0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1dbd0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1dbe0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1dbf0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1dc00 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1dc10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1dc20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1dc30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1dc40 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1dc50 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1dc60 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1dc70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dc80 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1dc90 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
1dca0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1dcb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1dcc0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1dcd0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1dce0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1dcf0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1dd00 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1dd10 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
1dd20 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
1dd30 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
1dd40 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
1dd50 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
1dd60 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
1dd70 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
1dd80 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
1dd90 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
1dda0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1ddb0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
1ddc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ddd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dde0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1ddf0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1de00 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50  _UNLOCK );..  pP
1de10 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1de20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1de30 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1de40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1de50 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
1de60 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1de70 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  he. */.    int n
1de80 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  Max;.    int h;.
1de90 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1dea0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
1deb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c     rc = pagerAll
1dec0 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72  ocatePage(pPager
1ded0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1dee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1def0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1df00 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  c;.    }..    pP
1df10 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1df20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1df30 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65  DB || pgno>pPage
1df40 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20  r->stmtSize );. 
1df50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
1df60 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
1df70 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
1df80 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 23 69  origDbSize ){.#i
1df90 66 20 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f 0.      sqlite
1dfa0 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
1dfb0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
1dfc0 20 70 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66   pgno/8);.#endif
1dfd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dfe0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1dff0 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
1e000 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
1e010 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1e020 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
1e030 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
1e040 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1e050 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
1e060 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
1e070 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1e080 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1e090 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1e0a0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1e0b0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
1e0c0 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
1e0d0 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  Pg);..    pPager
1e0e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66  ->nRef++;.    if
1e0f0 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
1e100 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
1e110 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
1e120 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
1e130 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
1e140 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  a);.    }.    nM
1e150 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ax = sqlite3Page
1e160 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1e170 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  r);.    if( pPag
1e180 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1e190 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e1a0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1e1b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1e1c0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
1e1d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e1e0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
1e1f0 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64   the page with d
1e200 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72  ata, either by r
1e210 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1e220 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1e230 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74  file, or by sett
1e240 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
1e250 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  age to zero..   
1e260 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   */.    if( nMax
1e270 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
1e280 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e  MDB || (noConten
1e290 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c  t && !pPager->al
1e2a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b  waysRollback) ){
1e2b0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1e2c0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1e2d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e2e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1e2f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e300 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1e310 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
1e320 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
1e330 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
1e340 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1e350 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
1e360 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20   = noContent && 
1e370 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
1e380 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49  ollback;.      I
1e390 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
1e3a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e3b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
1e3c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
1e3d0 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c  adDbPage(pPager,
1e3e0 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20   pPg, pgno);.   
1e3f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e400 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1e410 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1e420 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EAD ){.        p
1e430 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
1e440 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e450 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1e460 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1e480 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
1e490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e4a0 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e  Link the page in
1e4b0 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68  to the page hash
1e4c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20   table */.    h 
1e4d0 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
1e4e0 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
1e4f0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
1e500 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
1e510 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e520 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
1e530 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
1e540 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
1e550 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
1e560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1e570 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
1e580 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
1e590 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1e5a0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
1e5b0 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  pPg;.    }..#ifd
1e5c0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1e5d0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
1e5e0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1e5f0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1e600 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1e610 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1e620 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
1e630 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
1e640 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  /.    assert(pPa
1e650 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
1e660 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47  gno==1);.    PAG
1e670 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1e680 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21  nHit);.    if( !
1e690 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
1e6a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65     rc = pager_ge
1e6b0 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1e6c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e6d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e6e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1e6f0 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
1e700 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
1e710 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
1e720 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1e730 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
1e740 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1e750 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1e760 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1e770 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e780 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1e790 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1e7a0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1e7b0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1e7c0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1e7d0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1e7e0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1e7f0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1e800 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1e810 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1e820 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1e830 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1e840 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1e850 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1e860 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
1e870 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
1e880 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e   pgno, ppPage, n
1e890 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67  oContent);.  pag
1e8a0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1e8b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e8c0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1e8d0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
1e8e0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
1e8f0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
1e900 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
1e910 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
1e920 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
1e930 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
1e940 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
1e950 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1e960 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
1e970 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1e980 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
1e990 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1e9a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
1e9b0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
1e9c0 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
1e9d0 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
1e9e0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
1e9f0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
1ea00 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
1ea10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
1ea20 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
1ea30 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1ea40 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
1ea50 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1ea60 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
1ea70 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
1ea80 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
1ea90 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
1eaa0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
1eab0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1eac0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1ead0 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73   *pPg = 0;..  as
1eae0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1eaf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
1eb00 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72  o!=0 );..  pager
1eb10 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1eb20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1eb30 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1eb40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1eb50 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c  !pPager->pAll ||
1eb60 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1eb70 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73  veMode );.  }els
1eb80 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
1eb90 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1eba0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1ebb0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20  _FULL ){.    /* 
1ebc0 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20  Do nothing */.  
1ebd0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d  }else if( (pPg =
1ebe0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1ebf0 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20  ager, pgno))!=0 
1ec00 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  ){.    page_ref(
1ec10 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
1ec20 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1ec30 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
1ec40 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
1ec50 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1ec60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
1ec70 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1ec80 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
1ec90 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
1eca0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
1ecb0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
1ecc0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
1ecd0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
1ece0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
1ecf0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1ed00 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
1ed10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ed20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
1ed30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1ed40 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
1ed50 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72  pPg){..  /* Decr
1ed60 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
1ed70 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
1ed80 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61  is page.  */.  a
1ed90 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1eda0 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  >0 );.  pagerEnt
1edb0 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
1edc0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
1edd0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
1ede0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1edf0 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
1ee00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1ee10 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
1ee20 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
1ee30 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
1ee40 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
1ee50 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
1ee60 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
1ee70 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
1ee80 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1ee90 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1eea0 3b 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41 64  ;..    lruListAd
1eeb0 64 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  d(pPg);.    if( 
1eec0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1eed0 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
1eee0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
1eef0 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
1ef00 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1ef10 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
1ef20 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
1ef30 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
1ef40 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
1ef50 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
1ef60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1ef70 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1ef80 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
1ef90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1efa0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
1efb0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1efc0 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
1efd0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1efe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1eff0 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  >0) ){.      pag
1f000 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1f010 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f020 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65   }.  }.  pagerLe
1f030 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29  ave(pPg->pPager)
1f040 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1f060 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
1f070 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
1f080 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
1f090 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
1f0a0 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
1f0b0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1f0c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1f0d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1f0e0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1f0f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1f100 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1f110 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
1f120 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
1f130 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
1f140 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
1f150 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
1f160 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f170 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
1f180 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f190 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1f1a0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1f1b0 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1f1c0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1f1d0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1f1e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
1f1f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1f200 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  );..  int rc;.  
1f210 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1f220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f230 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1f240 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
1f250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1f260 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
1f270 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f280 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1f290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f2a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1f2b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1f2c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1f2d0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
1f2e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  e(pPager);.  pPa
1f2f0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1f300 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
1f310 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ero( pPager->dbS
1f320 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70  ize/8 + 1 );.  p
1f330 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1f340 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1f350 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1f360 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1f370 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
1f380 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1f390 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20  _journal;.  }.. 
1f3a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1f3b0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61  pFile ){.    fla
1f3c0 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
1f3d0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1f3e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
1f3f0 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65  P_JOURNAL);.  }e
1f400 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  lse{.    flags |
1f410 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
1f420 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
1f430 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1f440 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1f450 49 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ITE.  rc = sqlit
1f460 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
1f470 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
1f480 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1f490 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1f4a0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
1f4b0 70 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c  pPager).  );.#el
1f4c0 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  se.  rc = sqlite
1f4d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1f4e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1f4f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
1f500 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
1f510 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1f520 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1f530 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
1f540 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
1f550 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
1f560 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1f570 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1f580 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1f590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
1f5b0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1f5c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f5d0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
1f5e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1f5f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   0);.    }.    g
1f600 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1f610 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1f620 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f630 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
1f640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1f650 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
1f660 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1f670 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
1f680 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
1f690 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1f6a0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
1f6b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1f6c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1f6d0 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
1f6e0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1f6f0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
1f700 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1f710 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1f720 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
1f730 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1f740 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1f750 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
1f760 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f770 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1f780 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
1f790 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
1f7a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f7b0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1f7c0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
1f7d0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1f7e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
1f7f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1f820 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
1f830 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
1f840 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1f850 6c 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  l:.  sqlite3_fre
1f860 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
1f870 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
1f880 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
1f890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f8a0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1f8b0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1f8c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
1f8d0 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
1f8e0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
1f8f0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1f900 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
1f910 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1f920 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1f930 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1f940 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1f950 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  erRollback() is 
1f960 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1f970 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1f980 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
1f990 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
1f9a0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61  gerUnref() is ca
1f9b0 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
1f9c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1f9d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1f9e0 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
1f9f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1fa00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
1fa10 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
1fa20 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
1fa30 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
1fa40 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
1fa50 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
1fa60 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
1fa70 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
1fa80 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1fa90 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
1faa0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
1fab0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
1fac0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
1fad0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1fae0 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
1faf0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
1fb00 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
1fb10 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
1fb20 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
1fb30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
1fb40 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
1fb50 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1fb60 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
1fb70 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
1fb80 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
1fb90 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
1fba0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
1fbb0 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
1fbc0 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
1fbd0 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
1fbe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1fbf0 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
1fc00 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
1fc10 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
1fc20 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1fc30 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
1fc40 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1fc50 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
1fc60 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
1fc70 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1fc80 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
1fc90 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
1fca0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
1fcb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1fcc0 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
1fcd0 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
1fce0 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
1fcf0 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
1fd00 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
1fd10 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
1fd20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
1fd30 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
1fd40 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
1fd50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
1fd60 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67  egin(DbPage *pPg
1fd70 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20  , int exFlag){. 
1fd80 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1fd90 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1fda0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fdb0 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  OK;.  pagerEnter
1fdc0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
1fdd0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1fde0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fdf0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1fe00 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
1fe10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1fe20 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
1fe30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fe40 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1fe50 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
1fe60 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
1fe70 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1fe80 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1fe90 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1fea0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1feb0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
1fec0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1fed0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1fee0 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
1fef0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
1ff00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ff10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1ff20 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1ff30 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
1ff40 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
1ff50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ff60 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1ff70 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1ff80 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
1ff90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ffa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ffb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ffc0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1ffd0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ger);.        re
1ffe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fff0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
20000 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
20010 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
20020 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
20030 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20040 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
20050 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
20060 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
20070 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20080 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
20090 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
200a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
200b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
200c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
200d0 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
200e0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
200f0 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
20100 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
20110 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
20120 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c  ve-access mode l
20130 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
20140 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
20150 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
20160 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
20170 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
20180 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
20190 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
201a0 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
201b0 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
201c0 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
201d0 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20  n and truncated 
201e0 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20  to 0 bytes..    
201f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
20200 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
20210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20220 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20230 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20240 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
20250 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
20260 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20270 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
20280 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
20290 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
202a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
202b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
202c0 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
202d0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 70  e/8 + 1 );.    p
202e0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
202f0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
20300 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
20310 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20320 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
20330 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
20340 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20350 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20360 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
20370 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
20380 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
20390 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
203a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
203b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203c0 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
203d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65  ITE_OK );.  page
203e0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
203f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20400 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
20410 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74  e dirty.  Set it
20420 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64  s dirty flag and
20430 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64   add it to the d
20440 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73  irty.** page lis
20450 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
20460 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64  d makeDirty(PgHd
20470 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
20480 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a  Pg->dirty==0 ){.
20490 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
204a0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
204b0 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
204c0 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
204d0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
204e0 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70  Dirty;.    if( p
204f0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b  Pager->pDirty ){
20500 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
20510 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
20520 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  y = pPg;.    }. 
20530 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
20540 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
20550 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
20560 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
20570 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e  ake a page clean
20580 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72  .  Clear its dir
20590 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76  ty bit and remov
205a0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  e it from the.**
205b0 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74   dirty page list
205c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
205d0 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
205e0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
205f0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
20600 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
20610 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69      if( pPg->pDi
20620 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
20630 65 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79  ert( pPg->pDirty
20640 2d 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50  ->pPrevDirty==pP
20650 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
20660 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
20670 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
20680 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
20690 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
206a0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
206b0 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44  ert( pPg->pPrevD
206c0 69 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50  irty->pDirty==pP
206d0 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
206e0 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
206f0 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
20700 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20710 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
20720 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d  pPager->pDirty==
20730 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
20740 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
20750 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
20760 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
20770 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
20780 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
20790 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
207a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
207b0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
207c0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
207d0 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
207e0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
207f0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
20800 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
20810 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
20820 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
20830 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20840 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
20850 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
20860 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
20870 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
20880 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
20890 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
208a0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
208b0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
208c0 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
208d0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
208e0 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
208f0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
20900 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
20910 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
20920 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
20930 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
20940 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
20950 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
20960 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
20970 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
20980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20990 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
209a0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
209b0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
209c0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
209d0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
209e0 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
209f0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
20a00 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
20a10 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
20a20 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
20a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
20a40 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
20a50 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
20a60 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20a70 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
20a80 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
20a90 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
20aa0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
20ab0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
20ac0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
20ad0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
20ae0 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg);.  Pager *pP
20af0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
20b00 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
20b10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
20b20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
20b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
20b40 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
20b50 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
20b60 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
20b70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
20b80 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
20b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
20ba0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20bb0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
20bc0 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
20bd0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
20be0 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
20bf0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
20c00 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
20c10 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
20c20 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
20c30 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
20c40 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
20c50 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
20c60 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
20c70 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
20c80 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
20c90 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
20ca0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
20cb0 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
20cc0 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
20cd0 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
20ce0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
20cf0 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
20d00 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
20d10 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
20d20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
20d30 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
20d40 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
20d50 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
20d60 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
20d70 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
20d80 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
20d90 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
20da0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
20db0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
20dc0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
20dd0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
20de0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
20df0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
20e00 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
20e10 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
20e20 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
20e30 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
20e40 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
20e50 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
20e60 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
20e70 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
20e80 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
20e90 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
20ea0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
20eb0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
20ec0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
20ed0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
20ee0 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
20ef0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
20f00 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
20f10 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
20f20 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
20f30 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
20f40 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
20f50 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
20f60 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
20f70 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
20f80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20f90 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
20fa0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
20fb0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
20fc0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
20fd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20fe0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
20ff0 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
21000 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
21010 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
21020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21030 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21040 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
21050 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21060 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
21070 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
21080 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21090 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
210a0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
210b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
210c0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
210d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
210e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
210f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21100 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
21120 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
21130 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
21140 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
21150 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
21160 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
21170 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
21180 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
21190 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
211a0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
211b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
211c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
211d0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
211e0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
211f0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
21200 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
21210 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
21220 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
21230 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
21240 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
21250 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
21260 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
21270 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
21280 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
21290 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
212a0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
212b0 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
212c0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
212d0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
212e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
212f0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
21300 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
21310 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
21320 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
21330 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
21340 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
21350 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
21360 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
21370 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21380 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
21390 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
213a0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
213b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
213c0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
213d0 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
213e0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
213f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21420 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
21430 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
21440 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  a2;..          /
21450 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
21460 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
21470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
21480 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
21490 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
214a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
214b0 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
214c0 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
214d0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
214e0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
214f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
21500 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
21510 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
21520 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
21530 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
21540 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
21550 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
21560 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
21570 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
21580 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
21590 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  a2);.          r
215a0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
215b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
215c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
215d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
215e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
215f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21600 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21610 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
21620 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
21630 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21640 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21670 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
21680 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21690 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
216a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
216b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
216c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
216d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
216e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
216f0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
21700 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
21710 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
21720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
21730 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21740 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
21750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f    }.          IO
21760 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
21770 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
21780 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21790 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
217a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
217b0 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
217c0 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
217d0 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
217e0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
217f0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
21800 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
21810 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE5("JOURNAL %
21820 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
21830 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
21840 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21850 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
21860 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
21870 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
21880 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
21890 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  g));..          
218a0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
218b0 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
218c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
218d0 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
218e0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
218f0 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
21900 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
21910 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
21920 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21960 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21970 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
21980 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
21990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
219a0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
219b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
219c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
219d0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
219e0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
219f0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
21a00 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
21a10 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
21a20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21a30 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
21a40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
21a50 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
21a60 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
21a70 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
21a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21aa0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
21ab0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
21ac0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
21ad0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
21ae0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
21af0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
21b00 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
21b10 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
21b20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
21b30 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
21b40 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
21b50 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
21b60 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
21b70 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
21b80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
21b90 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21ba0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
21bb0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
21bc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
21bd0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
21be0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
21bf0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
21c00 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
21c10 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
21c20 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
21c30 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
21c40 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
21c50 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
21c60 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
21c70 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
21c80 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
21c90 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
21ca0 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
21cb0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
21cc0 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
21cd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
21ce0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21cf0 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
21d00 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
21d10 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
21d20 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
21d30 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
21d40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d50 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
21d60 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
21d70 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21d80 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
21d90 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
21da0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
21db0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21dc0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
21dd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21de0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
21df0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
21e00 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
21e10 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
21e20 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
21e30 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
21e40 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
21e50 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
21e60 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
21e70 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
21e80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ea0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
21eb0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
21ec0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
21ed0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21ee0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
21ef0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
21f00 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
21f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21f20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
21f30 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28  ager->stmtNRec*(
21f40 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21f50 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ze);.        cha
21f60 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
21f70 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
21f80 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
21f90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
21fa0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
21fb0 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->stfd, offset, 
21fc0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
21fd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22000 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
22010 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  tfd, pData2, pPa
22020 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
22030 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
22040 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
22050 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
22060 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22070 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
22080 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
22090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
220a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
220b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
220c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
220d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
220e0 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
220f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22100 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
22110 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22120 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
22130 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
22140 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
22150 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
22160 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
22170 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
22180 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
22190 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
221a0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
221b0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
221c0 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
221d0 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
221e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
221f0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
22200 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
22210 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
22220 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
22230 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
22240 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
22250 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
22260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22270 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22280 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
22290 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
222a0 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
222b0 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
222c0 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
222d0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
222e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
222f0 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
22300 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
22310 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
22320 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
22330 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
22340 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
22350 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
22360 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
22370 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
22380 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
22390 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
223a0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
223b0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
223c0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
223d0 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
223e0 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
223f0 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
22400 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
22410 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
22420 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
22430 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
22440 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22450 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
22460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22470 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
22480 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
22490 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
224a0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
224b0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
224c0 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
224d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
224e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
224f0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
22500 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
22510 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
22520 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
22530 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
22540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
22550 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
22560 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
22570 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
22580 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
22590 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
225a0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
225b0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
225c0 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
225d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
225e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
225f0 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
22600 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
22610 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
22620 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
22630 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
22640 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
22650 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
22660 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
22670 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
22680 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
22690 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
226a0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
226b0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
226c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
226d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
226e0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
226f0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
22700 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
22710 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
22720 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
22730 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
22740 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
22750 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
22760 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
22770 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
22780 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
22790 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
227a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
227b0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
227c0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
227d0 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
227e0 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
227f0 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
22800 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
22810 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
22820 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
22830 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
22840 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
22850 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
22860 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
22870 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
22880 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
22890 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
228a0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
228b0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
228c0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
228d0 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
228e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
228f0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
22900 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
22910 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
22920 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
22930 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
22940 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
22950 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
22960 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
22970 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
22980 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
22990 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
229a0 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
229b0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
229c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
229d0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->aInJournal || 
229e0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
229f0 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70   .          pg>p
22a00 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22a10 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61  e || !(pPager->a
22a20 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26  InJournal[pg/8]&
22a30 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20  (1<<(pg&7))).   
22a40 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69     ) {.        i
22a50 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
22a60 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
22a70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22a80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
22a90 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
22aa0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
22ab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22ad0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
22ae0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
22af0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
22b00 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
22b10 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
22b20 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
22b30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22b40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22b50 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
22b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22b80 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
22b90 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
22ba0 67 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g)) ){.        i
22bb0 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79  f( pPage->needSy
22bc0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
22bd0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
22be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22bf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
22c00 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
22c10 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
22c20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
22c30 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
22c40 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
22c50 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
22c60 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
22c70 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
22c80 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
22c90 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
22ca0 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
22cb0 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
22cc0 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
22cd0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
22ce0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
22cf0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
22d00 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
22d10 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
22d20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
22d30 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
22d40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
22d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
22d60 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66  dSync ){.      f
22d70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
22d80 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
22d90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
22da0 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
22db0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
22dc0 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
22dd0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
22de0 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  Page->needSync =
22df0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22e00 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
22e10 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
22e20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
22e30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
22e40 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
22e50 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
22e60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22e70 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
22e80 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
22e90 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
22ea0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
22eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22ec0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
22ed0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
22ee0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
22ef0 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
22f00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
22f10 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
22f20 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
22f30 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
22f40 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
22f50 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22f60 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
22f70 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
22f80 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
22f90 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
22fa0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
22fb0 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69  ->dirty;.}.#endi
22fc0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
22fd0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
22fe0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
22ff0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
23000 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
23010 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
23020 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
23030 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
23040 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
23050 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
23060 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
23070 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
23080 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
23090 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74   rc;..  pagerEnt
230a0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
230b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
230c0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
230d0 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
230e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
230f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23100 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
23110 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
23130 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67  emcpy(sqlite3Pag
23140 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20  erGetData(pPg), 
23150 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
23160 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
23170 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23180 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  Unref(pPg);.  }.
23190 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
231a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
231b0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
231c0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
231d0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
231e0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
231f0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
23200 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
23210 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
23220 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
23230 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
23240 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
23250 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
23260 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
23270 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
23280 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
23290 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
232a0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
232b0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
232c0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
232d0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
232e0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
232f0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
23300 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
23310 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
23320 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
23330 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
23340 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
23350 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
23360 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
23370 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
23380 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
23390 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
233a0 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
233b0 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
233c0 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
233d0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
233e0 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
233f0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
23400 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
23410 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
23420 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
23430 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
23440 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
23450 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
23460 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
23470 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
23480 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
23490 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
234a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
234b0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
234c0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
234d0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
234e0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
234f0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
23500 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
23510 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
23520 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
23530 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
23540 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
23550 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
23560 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
23570 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
23580 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
23590 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
235a0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
235b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
235c0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
235d0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
235e0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
235f0 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
23600 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
23610 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
23620 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
23630 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
23640 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
23650 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
23660 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
23670 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
23680 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
23690 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
236a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
236b0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
236c0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
236d0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
236e0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
236f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
23700 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ager;..  if( MEM
23710 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  DB ) return;.  p
23720 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
23730 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
23740 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
23750 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
23760 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
23770 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
23780 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23790 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
237a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
237b0 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
237c0 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
237d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
237e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
237f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
23800 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
23810 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
23820 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
23830 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
23840 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
23850 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
23860 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
23870 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
23880 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
23890 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
238a0 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
238b0 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
238c0 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
238d0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
238e0 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
238f0 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
23900 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
23910 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
23920 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
23930 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
23940 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
23950 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
23960 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
23970 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
23980 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
23990 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
239a0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
239b0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
239c0 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
239d0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
239e0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
239f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
23a00 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
23a10 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
23a20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
23a30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
23a40 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
23a50 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
23a60 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
23a70 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61  >pgno)).      ma
23a80 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
23a90 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
23aa0 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
23ab0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
23ac0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
23ad0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
23ae0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
23af0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
23b00 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
23b10 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
23b20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
23b30 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
23b40 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
23b50 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
23b60 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
23b70 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
23b80 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
23b90 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
23ba0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
23bb0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
23bc0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
23bd0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
23be0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
23bf0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
23c00 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
23c10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
23c20 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
23c30 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
23c40 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
23c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
23c60 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
23c70 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
23c80 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
23c90 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
23ca0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
23cb0 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
23cc0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
23cd0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
23ce0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
23cf0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
23d00 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
23d10 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
23d20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
23d30 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ager;..  pagerEn
23d40 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
23d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23d60 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
23d70 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
23d80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
23d90 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
23da0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
23db0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
23dc0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
23dd0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
23de0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
23df0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
23e00 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
23e10 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
23e20 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
23e30 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
23e40 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
23e50 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
23e60 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
23e70 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
23e80 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
23e90 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
23ea0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
23eb0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
23ec0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
23ed0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
23ee0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
23ef0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
23f00 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
23f10 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
23f20 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
23f30 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
23f40 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
23f50 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
23f60 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
23f70 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
23f80 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
23f90 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
23fa0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
23fb0 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
23fc0 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
23fd0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
23fe0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
23ff0 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
24000 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
24010 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
24020 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
24030 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
24040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
24050 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
24060 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
24070 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
24080 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
24090 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
240a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ave(pPager);.}..
240b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
240c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
240d0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
240e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
240f0 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
24100 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
24110 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
24120 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
24130 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
24140 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
24150 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
24160 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64  sDirect){.  PgHd
24170 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
24180 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
24190 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
241a0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
241b0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
241c0 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
241d0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
241e0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
241f0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
24200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24210 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
24220 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
24230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
24240 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69  eturn rc;..    i
24250 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a  f( !isDirect ){.
24260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24270 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
24280 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Hdr);.      if( 
24290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
242a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
242b0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
242c0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
242d0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
242e0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
242f0 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
24300 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
24310 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
24320 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
24330 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67  Vers);.    chang
24340 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
24350 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
24360 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
24370 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
24380 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
24390 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74      if( isDirect
243a0 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
243b0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
243c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
243d0 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  uf = PGHDR_TO_DA
243e0 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  TA(pPgHdr);.    
243f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24400 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
24410 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
24420 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
24430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
24440 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
24450 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
24460 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24470 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
24480 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
24490 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
244a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
244b0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
244c0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
244d0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
244e0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
244f0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
24500 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
24510 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
24520 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
24530 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
24540 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
24550 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
24560 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
24570 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
24580 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
24590 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
245a0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
245b0 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
245c0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
245d0 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
245e0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
245f0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
24600 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
24610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
24620 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
24630 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
24640 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
24650 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
24660 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
24670 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
24680 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
24690 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
246a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
246b0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
246c0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
246d0 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
246e0 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
246f0 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
24700 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
24710 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
24720 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
24730 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
24740 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
24750 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
24760 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
24770 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
24780 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
24790 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
247a0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
247b0 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
247c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
247d0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
247e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
247f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
24800 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
24810 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
24820 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47  QLITE_OK;..  PAG
24830 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
24840 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
24850 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
24860 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
24870 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
24880 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
24890 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  unc);.  pagerEnt
248a0 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  er(pPager);..  /
248b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
248c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
248d0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
248e0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
248f0 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
24900 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
24910 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
24920 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
24930 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
24940 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
24950 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
24960 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
24970 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
24980 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20  r *pPg;..#ifdef 
24990 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
249a0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f  OMIC_WRITE.    /
249b0 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  * The atomic-wri
249c0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
249d0 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61  can be used if a
249e0 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ll of the.    **
249f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
24a00 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue:.    **.    
24a10 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65  **    + The file
24a20 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
24a30 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
24a40 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
24a50 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
24a60 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
24a70 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ize, and.    ** 
24a80 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74     + This commit
24a90 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
24aa0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
24ab0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
24ac0 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c    **    + Exactl
24ad0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
24ae0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
24af0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
24b00 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
24b10 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
24b20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
24b30 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20  n be used, then 
24b40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24b50 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20   will never.    
24b60 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f  ** be created fo
24b70 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
24b80 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
24b90 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  nt useAtomicWrit
24ba0 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a  e = (.        !z
24bb0 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20  Master && .     
24bc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
24bd0 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
24be0 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26 26  rSize(pPager) &&
24bf0 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63   .        nTrunc
24c00 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 20  ==0 && .        
24c10 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72  (0==pPager->pDir
24c20 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d  ty || 0==pPager-
24c30 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79 29  >pDirty->pDirty)
24c40 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
24c50 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29  useAtomicWrite )
24c60 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  {.      /* Updat
24c70 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
24c80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
24c90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
24ca0 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  nt offset = pPag
24cb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
24cc0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
24cd0 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61 73  Magic);.      as
24ce0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65  sert(pPager->nRe
24cf0 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63 20  c==1);.      rc 
24d00 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
24d10 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65  ager->jfd, offse
24d20 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  t, pPager->nRec)
24d30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
24d40 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
24d50 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 54  hange counter. T
24d60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
24d70 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20  l will modify.  
24d80 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65      ** the in-me
24d90 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
24da0 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74 6f  ion of page 1 to
24db0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64   include the upd
24dc0 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63 68  ated.      ** ch
24dd0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64  ange counter and
24de0 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65   then write page
24df0 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74   1 directly to t
24e00 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
24e10 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61 75    ** file. Becau
24e20 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
24e30 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
24e40 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65  of the host file
24e50 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20 20  -system, .      
24e60 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  ** this is safe.
24e70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
24e80 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
24e90 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
24ea0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ager, 1);.    }e
24eb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
24ec0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
24ed0 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
24ee0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
24ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
24f00 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
24f10 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65   }..    if( !use
24f20 41 74 6f 6d 69 63 57 72 69 74 65 20 29 0a 23 65  AtomicWrite ).#e
24f30 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
24f40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
24f50 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
24f60 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
24f70 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
24f80 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
24f90 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
24fa0 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
24fb0 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
24fc0 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
24fd0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
24fe0 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
24ff0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
25000 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
25010 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
25020 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
25030 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
25040 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
25050 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
25060 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
25070 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
25080 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
25090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
250a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
250b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
250c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
250d0 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 72  lOpen );.      r
250e0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
250f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
25100 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
25110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25120 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
25130 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
25140 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25150 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
25160 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
25170 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
25180 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
25190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
251a0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
251b0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
251c0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
251d0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
251e0 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
251f0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
25200 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
25210 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
25220 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
25230 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
25240 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
25250 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
25260 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
25270 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
25280 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
25290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
252a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
252b0 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
252c0 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
252d0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
252e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
252f0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
25300 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
25310 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25320 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
25330 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
25340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25350 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
25360 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25370 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
25380 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
25390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
253a0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
253b0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
253c0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
253d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
253e0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
253f0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
25400 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
25410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25420 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
25430 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
25440 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
25450 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
25460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25470 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
25480 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
25490 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
254a0 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
254b0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
254c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
254d0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
254e0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
254f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25500 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
25510 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
25520 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
25530 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
25540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25550 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
25560 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
25570 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
25580 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
25590 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
255a0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
255b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
255c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
255d0 20 26 26 20 21 70 50 67 2d 3e 64 69 72 74 79 20   && !pPg->dirty 
255e0 29 7b 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44  ){ pPg = pPg->pD
255f0 69 72 74 79 3b 20 7d 0a 20 20 20 20 20 20 70 50  irty; }.      pP
25600 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
25610 50 67 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  Pg;.      goto s
25620 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
25630 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
25640 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ty = 0;..    /* 
25650 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
25660 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
25670 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
25680 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
25690 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
256a0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
256b0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
256c0 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
256d0 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
256e0 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
256f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
25700 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
25710 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
25720 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
25730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25740 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
25750 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
25760 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
25770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25780 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b  IOERR_BLOCKED ){
25790 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e  .    /* pager_in
257a0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
257b0 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74  () may attempt t
257c0 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  o obtain an excl
257d0 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63  usive.     * loc
257e0 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63  k to spill the c
257f0 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ache and return 
25800 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42  IOERR_BLOCKED. B
25810 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a  ut since .     *
25820 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
25830 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73  nce the cache is
25840 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69   inconsistent, i
25850 74 27 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65  t's.     * bette
25860 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  r to return SQLI
25870 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f  TE_BUSY..     */
25880 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
25890 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67  _BUSY;.  }.  pag
258a0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
258b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
258c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
258d0 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
258e0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
258f0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
25900 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
25910 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
25920 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
25930 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
25940 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
25950 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
25960 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
25970 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
25980 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
25990 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
259a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
259b0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
259c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
259d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
259e0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
259f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
25a00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
25a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
25a20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
25a30 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
25a40 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
25a50 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25a60 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74  ;.  }.  pagerEnt
25a70 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41  er(pPager);.  PA
25a80 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
25a90 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
25aa0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
25ab0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
25ac0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
25ad0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
25ae0 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
25af0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50  ( pPg ){.      P
25b00 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
25b10 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
25b20 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
25b30 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
25b40 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
25b50 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
25b60 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
25b70 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
25b80 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
25b90 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
25ba0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
25bb0 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
25bc0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
25bd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
25be0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
25bf0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
25c00 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
25c10 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25c20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
25c30 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
25c40 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
25c50 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
25c60 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
25c70 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
25c80 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
25c90 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
25ca0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
25cb0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
25cc0 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
25cd0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
25ce0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
25cf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
25d00 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
25d10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
25d20 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
25d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25d40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
25d50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
25d60 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
25d70 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
25d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25d90 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
25da0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
25db0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
25dc0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
25dd0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
25de0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
25df0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
25e00 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65  ger, rc);.  page
25e10 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
25e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25e30 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
25e40 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
25e50 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
25e60 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
25e70 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
25e80 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
25e90 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
25ea0 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
25eb0 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
25ec0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
25ed0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
25ee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
25ef0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
25f00 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
25f10 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
25f20 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
25f30 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
25f40 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73  ocol or unless s
25f50 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
25f60 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
25f70 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
25f80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
25f90 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
25fa0 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
25fb0 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
25fc0 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
25fd0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
25fe0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
25ff0 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
26000 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
26010 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
26020 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
26030 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
26040 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
26050 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
26060 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
26070 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52    PAGERTRACE2("R
26080 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
26090 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
260a0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
260b0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
260c0 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
260d0 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
260e0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
260f0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
26100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26110 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  p->alwaysRollbac
26120 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  k );.      if( !
26130 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
26140 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
26150 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
26160 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
26170 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  er))->pOrig );. 
26180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
26190 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
261a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
261b0 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29  Pager))->pStmt )
261c0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
261d0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
261e0 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
261f0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
26200 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
26210 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
26220 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
26230 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
26240 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
26250 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
26260 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
26270 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
26280 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
26290 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
262a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
262b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
262c0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41   PAGERTRACE3("PA
262d0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f  GE %d is clean o
262e0 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  n %d\n", p->pgno
262f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
26300 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
26310 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
26320 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
26330 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
26340 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
26350 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
26360 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
26370 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
26380 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
26390 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
263a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
263b0 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
263c0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
263d0 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70  ter(p, pPager->p
263e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
263f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
26400 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
26410 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
26420 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
26430 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
26440 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a  er->origDbSize;.
26450 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
26460 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
26470 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
26480 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
26490 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
264a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
264b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
264c0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65  _OK;.  }..  page
264d0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
264e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
264f0 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
26500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
26510 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
26520 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
26530 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
26540 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
26550 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
26560 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
26570 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
26580 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
26590 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
265a0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
265b0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
265c0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
265d0 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
265e0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
265f0 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76   }.    pagerLeav
26600 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
26610 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
26620 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
26630 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
26640 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
26650 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
26660 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
26670 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
26680 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
26690 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
266a0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
266b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
266c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
266d0 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
266e0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
266f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
26700 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a  er, 0);.  }.  /*
26710 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
26720 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65  ger); */.  pPage
26730 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
26740 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
26750 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
26760 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
26770 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
26780 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  st the pager.  *
26790 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
267a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
267b0 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
267c0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
267d0 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74  .  ** persistent
267e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
267f0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
26800 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65  , rc);.  pagerLe
26810 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
26820 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26830 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
26840 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
26850 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
26860 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
26870 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
26880 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
26890 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
268a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
268b0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
268c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
268d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
268e0 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
268f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26900 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
26910 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
26920 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
26930 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
26940 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26950 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
26960 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRef;.}..#ifdef 
26970 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
26980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
26990 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
269a0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
269b0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
269c0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
269d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
269e0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
269f0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
26a00 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
26a10 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
26a20 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
26a30 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
26a40 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
26a50 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
26a60 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
26a70 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
26a80 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20  rCode;.  a[6] = 
26a90 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
26aa0 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
26ab0 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30  Miss;.  a[8] = 0
26ac0 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65  ;  /* Used to be
26ad0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a   pPager->nOvfl *
26ae0 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  /.  a[9] = pPage
26af0 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
26b00 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
26b10 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
26b20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
26b30 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Set the statemen
26b40 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74  t rollback point
26b50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26b60 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
26b70 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
26b80 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
26b90 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
26ba0 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65  en.  A new state
26bb0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
26bc0 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
26bd0 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
26be0 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
26bf0 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
26c00 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
26c10 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
26c20 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
26c30 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65 67 69  nt pagerStmtBegi
26c40 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
26c50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
26c60 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
26c70 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
26c80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26c90 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
26ca0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
26cb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
26cc0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
26cd0 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
26ce0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
26cf0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
26d00 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
26d10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
26d20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
26d30 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
26d40 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
26d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26d60 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
26d70 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
26d80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
26d90 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
26da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26db0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
26dc0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26dd0 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72  lOpen );.  pager
26de0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
26df0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
26e00 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
26e10 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62  Zero( pPager->db
26e20 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
26e30 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
26e40 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
26e50 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
26e60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
26e70 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
26e80 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
26e90 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
26ea0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
26eb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
26ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
26ed0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
26ee0 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
26ef0 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
26f00 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
26f10 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
26f20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26f30 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
26f40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
26f50 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
26f60 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
26f70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26f80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
26f90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
26fa0 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
26fb0 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
26fc0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
26fd0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
26fe0 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
26ff0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
27000 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
27010 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
27020 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
27030 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70   pPager->stfd, p
27040 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c  Pager->zStmtJrnl
27050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
27080 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28  OURNAL);.    if(
27090 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
270a0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
270b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
270c0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
270d0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
270e0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
270f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
27100 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
27110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27120 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
27130 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
27140 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
27150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
27160 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b  Pager->aInStmt);
27170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
27180 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
27190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
271a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
271b0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
271c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
271d0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
271e0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
271f0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
27200 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
27210 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
27220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27230 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
27240 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
27250 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
27260 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
27270 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
27280 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
27290 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
272a0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
272b0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
272c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
272d0 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
272e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
272f0 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
27300 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
27310 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
27320 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
27330 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
27340 65 33 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d  e3_free( pPager-
27350 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  >aInStmt );.    
27360 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
27370 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
27380 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  {.      for(pPg=
27390 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
273a0 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
273b0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
273c0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
273d0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
273e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
273f0 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Next = pHist->pN
27400 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  extStmt;.       
27410 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
27420 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  inStmt );.      
27430 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
27440 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69  = 0;.        pHi
27450 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
27460 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
27470 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
27480 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74  lite3_free(pHist
27490 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
274a0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
274b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
274c0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
274d0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
274e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
274f0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
27500 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
27510 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
27520 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
27530 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
27540 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27550 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27560 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
27570 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
27580 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
27590 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
275a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
275b0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
275c0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
275d0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
275e0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
275f0 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
27600 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27610 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
27620 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
27630 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
27640 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
27650 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ist;.      for(p
27660 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
27670 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74  ; pPg; pPg=pHist
27680 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
27690 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
276a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
276b0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
276c0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
276d0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
276e0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
276f0 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
27700 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
27710 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
27720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27730 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
27740 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
27750 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
27760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27770 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
27780 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
27790 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  tmtSize;.      p
277a0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
277b0 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
277c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
277d0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
277e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
277f0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
27800 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
27810 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
27820 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
27830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
27840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
27850 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
27860 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
27870 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27880 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27890 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
278a0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
278b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
278c0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
278d0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
278e0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
278f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
27900 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
27910 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
27920 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
27930 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
27940 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
27950 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
27960 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
27970 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27980 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
27990 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
279a0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
279b0 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
279c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
279d0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
279e0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
279f0 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
27a00 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
27a10 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
27a20 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
27a30 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
27a40 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
27a50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
27a60 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
27a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27a80 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
27a90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
27aa0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
27ab0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
27ac0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
27ad0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
27ae0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
27af0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
27b00 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
27b10 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
27b20 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
27b30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
27b40 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
27b50 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
27b60 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
27b70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
27b80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
27b90 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
27ba0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
27bb0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
27bc0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
27bd0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
27be0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
27bf0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
27c00 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
27c10 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27c20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
27c30 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
27c40 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
27c50 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
27c60 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
27c70 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
27c80 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
27c90 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
27ca0 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
27cb0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
27cc0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
27cd0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
27ce0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
27cf0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
27d00 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
27d10 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
27d20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
27d30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
27d40 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
27d50 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20  ve the page pPg 
27d60 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
27d70 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
27d80 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
27d90 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
27da0 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65   to the page pre
27db0 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
27dc0 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63  at.** pgno (whic
27dd0 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64  h we call pPgOld
27de0 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61  ) though that pa
27df0 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  ge is allowed to
27e00 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e   be.** in cache.
27e10 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72    If the page pr
27e20 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61  evious located a
27e30 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
27e40 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
27e50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
27e60 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
27e70 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
27e80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
27e90 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
27ea0 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
27eb0 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
27ec0 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
27ed0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
27ee0 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
27ef0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
27f00 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
27f10 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
27f20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
27f30 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
27f40 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
27f50 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
27f60 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
27f70 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
27f80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
27f90 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
27fa0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
27fb0 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
27fc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
27fd0 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
27fe0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
27ff0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
28000 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
28010 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
28020 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
28030 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
28040 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
28050 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
28060 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
28070 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
28080 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
28090 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
280a0 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20  pPgOld;  /* The 
280b0 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
280c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74  ritten. */.  int
280d0 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
280e0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
280f0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28100 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
28110 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
28120 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
28130 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
28140 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
28150 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
28160 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
28170 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
28180 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
28190 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
281a0 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
281b0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
281c0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70  gno, pgno))..  p
281d0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
281e0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
281f0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
28200 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
28210 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
28220 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
28230 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
28240 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
28250 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
28260 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
28270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28280 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
28290 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
282a0 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
282b0 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  's hash-chain */
282c0 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
282d0 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
282e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
282f0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
28300 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
28310 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
28320 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
28330 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
28340 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
28350 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
28360 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
28370 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
28380 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
28390 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
283a0 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
283b0 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
283c0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
283d0 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  /.  pPg->needSyn
283e0 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20  c = 0;.  pPgOld 
283f0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
28400 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
28410 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
28420 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
28430 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
28440 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
28450 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
28460 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
28470 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
28480 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67  ->needSync = pPg
28490 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20  Old->needSync;. 
284a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
284b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
284c0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
284d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
284e0 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
284f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
28500 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
28510 61 6c 20 3d 20 20 28 70 50 61 67 65 72 2d 3e 61  al =  (pPager->a
28520 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
28530 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
28540 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ))!=0;.  }else{.
28550 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
28560 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
28570 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
28580 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e  c==0 || (int)pgn
28590 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
285a0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Size );.  }..  /
285b0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
285c0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
285d0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
285e0 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
285f0 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73  -chain. */.  ass
28600 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
28610 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
28620 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26  no;.  h = pgno &
28630 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
28640 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  1);.  if( pPager
28650 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
28660 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28670 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
28680 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
28690 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
286a0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
286b0 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
286c0 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
286d0 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
286e0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
286f0 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
28700 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d  evHash = 0;..  m
28710 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
28720 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
28730 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  che = 1;..  if( 
28740 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
28750 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
28760 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
28770 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
28780 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
28790 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
287a0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
287b0 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
287c0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
287d0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
287e0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
287f0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
28800 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
28810 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
28820 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61  d the .    ** Pa
28830 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.aInJournal b
28840 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  it has been set.
28850 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
28860 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f  e remedied by lo
28870 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ading.    ** the
28880 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
28890 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
288a0 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
288b0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a  .needSync flag..
288c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
288d0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
288e0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
288f0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
28900 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
28910 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
28920 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
28930 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
28940 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
28950 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
28960 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
28970 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
28980 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
28990 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
289a0 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
289b0 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
289c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
289d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
289e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
289f0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
28a00 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63  pPgHdr->needSync
28a10 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
28a20 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
28a30 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70  .    makeDirty(p
28a40 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
28a50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
28a60 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61  gHdr);.  }..  pa
28a70 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28a80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28a90 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
28aa0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
28ab0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
28ac0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
28ad0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
28ae0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
28af0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
28b00 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
28b10 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
28b20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
28b30 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
28b40 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
28b50 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
28b60 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
28b70 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
28b80 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
28b90 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
28ba0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
28bb0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
28bc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28bd0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
28be0 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
28bf0 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
28c00 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
28c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
28c20 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
28c30 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
28c40 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
28c50 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
28c60 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
28c70 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
28c80 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
28c90 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
28ca0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
28cb0 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
28cc0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
28cd0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
28ce0 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
28cf0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
28d00 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
28d10 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
28d20 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
28d30 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
28d40 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
28d50 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
28d60 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
28d70 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
28d80 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
28d90 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
28da0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
28db0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28dc0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
28dd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
28de0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
28df0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
28e00 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
28e10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
28e20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
28e30 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
28e40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
28e50 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
28e60 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
28e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
28e80 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
28e90 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
28ea0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
28eb0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
28ec0 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
28ed0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
28ee0 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
28ef0 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
28f00 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
28f10 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
28f20 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
28f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
28f40 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
28f50 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64  iveMode;.}..#ifd
28f60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f70 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
28f80 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
28f90 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
28fa0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
28fb0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
28fc0 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
28fd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28fe0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
28ff0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
29000 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
29010 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
29020 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
29030 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
29040 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
29050 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
29060 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
29070 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
29080 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
29090 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
290a0 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
290b0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
290c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
290d0 4f 20 2a 2f 0a                                   O */.