/ Hex Artifact Content
Login

Artifact cfa6dc38b797206549491de3ec7f0aea50611dda:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 37  : pager.c,v 1.37
0350: 37 20 32 30 30 37 2f 30 38 2f 32 37 20 31 37 3a  7 2007/08/27 17:
0360: 32 37 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37  27:49 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 74 79 70 65 64 65 66 20 73 74 72  Hdr;.typedef str
1620: 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  uct PagerLruLink
1630: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b 0a 73   PagerLruLink;.s
1640: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1650: 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a 70 4e  nk {.  PgHdr *pN
1660: 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ext;.  PgHdr *pP
1670: 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  rev;.};../*.** E
1680: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d  ach in-memory im
1690: 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62 65  age of a page be
16a0: 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66 6f  gins with the fo
16b0: 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e 0a  llowing header..
16c0: 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20 69  ** This header i
16d0: 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20 74  s only visible t
16e0: 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f 64  o this pager mod
16f0: 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e 74  ule.  The client
1700: 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63 61  .** code that ca
1710: 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20 6f  lls pager sees o
1720: 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68 61  nly the data tha
1730: 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65  t follows the he
1740: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65  ader..**.** Clie
1750: 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63  nt code should c
1760: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
1770: 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67  Write() on a pag
1780: 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e  e prior to makin
1790: 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63  g.** any modific
17a0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70  ations to that p
17b0: 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  age.  The first 
17c0: 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61 67 65  time sqlite3Page
17d0: 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63  rWrite().** is c
17e0: 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69  alled, the origi
17f0: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
1800: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
1810: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  to the rollback.
1820: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  ** journal and P
1830: 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61  gHdr.inJournal a
1840: 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  nd PgHdr.needSyn
1850: 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65  c are set.  Late
1860: 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a  r, once.** the j
1870: 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20  ournal page has 
1880: 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65  made it onto the
1890: 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50   disk surface, P
18a0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a  gHdr.needSync.**
18b0: 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68   is cleared.  Th
18c0: 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  e modified page 
18d0: 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65  cannot be writte
18e0: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
18f0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1900: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
1910: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1920: 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  s has been synce
1930: 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68  d to disk and th
1940: 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53  e.** PgHdr.needS
1950: 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65  ync has been cle
1960: 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ared..**.** The 
1970: 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67  PgHdr.dirty flag
1980: 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c   is set when sql
1990: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
19a0: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
19b0: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
19c0: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
19d0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
19e0: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
19f0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1a00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1a10: 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d 70 6f   Details of impo
1a20: 72 74 61 6e 74 20 73 74 72 75 63 74 75 72 65 20  rtant structure 
1a30: 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  elements:.**.** 
1a40: 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20  needSync.**.**  
1a50: 20 20 20 49 66 20 74 68 69 73 20 69 73 20 74 72     If this is tr
1a60: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
1a70: 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hat it is not sa
1a80: 66 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  fe to write the 
1a90: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74  page.**     cont
1aa0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
1ab0: 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ase because the 
1ac0: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1ad0: 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20 20 66   needed.**     f
1ae0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61 73 20  or rollback has 
1af0: 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20 74 6f  not by synced to
1b00: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1b10: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 20  ck journal..**  
1b20: 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20     The original 
1b30: 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61 76 65  content may have
1b40: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1b50: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1b60: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62 75 74  urnal.**     but
1b70: 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
1b80: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 53 6f  been synced.  So
1b90: 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69 74 65   we cannot write
1ba0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb0: 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62 65 63  .**     file bec
1bc0: 61 75 73 65 20 70 6f 77 65 72 20 66 61 69 6c 75  ause power failu
1bd0: 72 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 74  re might cause t
1be0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  he page in the j
1bf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1c00: 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65 61 63     to never reac
1c10: 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49 74 20  h the disk.  It 
1c20: 69 73 20 61 73 20 69 66 20 74 68 65 20 77 72 69  is as if the wri
1c30: 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1c40: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 64 6f  l file.**     do
1c50: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1c60: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  il the journal f
1c70: 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
1c80: 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 54 68  *     .**     Th
1c90: 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c 73 65  is flag is false
1ca0: 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
1cb0: 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d 61 74  tent exactly mat
1cc0: 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20 20 20  ches what.**    
1cd0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1ce0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1cf0: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e 65 65  e file.  The nee
1d00: 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c  dSync flag is al
1d10: 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73 65 20  so.**     false 
1d20: 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  if the original 
1d30: 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
1d40: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d50: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  main rollback.**
1d60: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64       journal and
1d70: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
1d80: 20 70 61 67 65 20 72 65 70 72 65 73 65 6e 74 73   page represents
1d90: 20 61 20 6e 65 77 20 70 61 67 65 20 74 68 61 74   a new page that
1da0: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
1db0: 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20   added onto the 
1dc0: 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1dd0: 61 73 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ase during the c
1de0: 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20 74 72  urrent.**     tr
1df0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6e  ansaction, the n
1e00: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1e10: 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65 20 6f  true until the o
1e20: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1e30: 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69 6e 20  .**     size in 
1e40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1e50: 65 72 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  er has been sync
1e60: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1e70: 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a 0a 2a  * inJournal.**.*
1e80: 2a 20 20 20 20 20 54 68 69 73 20 69 73 20 74 72  *     This is tr
1e90: 75 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e  ue if the origin
1ea0: 61 6c 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  al page has been
1eb0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ec0: 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20 72 6f  e main.**     ro
1ed0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1ee0: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
1ef0: 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20 70 61  false for new pa
1f00: 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  ges added to.** 
1f10: 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66 20 74      the end of t
1f20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f30: 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1f40: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
1f50: 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68 69 73  .**     And this
1f60: 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74 68 69   flag says nothi
1f70: 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68 65 72  ng about whether
1f80: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
1f90: 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  nal.**     has b
1fa0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1fb0: 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73 20 74  sk.  For pages t
1fc0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 6f  hat are in the o
1fd0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 64  riginal.**     d
1fe0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1ff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
2000: 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  ession should al
2010: 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a 2a 2a  ways be true:.**
2020: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f 75 72  .**       inJour
2030: 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
2040: 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e 6f 2d  InJournal[(pgno-
2050: 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28 70 67  1)/8] & (1<<((pg
2060: 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a 2a 0a  no-1)%8))!=0.**.
2070: 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65  **     The pPage
2080: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 20  r->aInJournal[] 
2090: 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20 76 61  array is only va
20a0: 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67  lid for the orig
20b0: 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65  inal.**     page
20c0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
20d0: 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73  e, not new pages
20e0: 20 74 68 61 74 20 61 72 65 20 61 64 64 65 64 20   that are added 
20f0: 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20  to the end.**   
2100: 20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73    of the databas
2110: 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20  e, so obviously 
2120: 74 68 65 20 61 62 6f 76 65 20 65 78 70 72 65 73  the above expres
2130: 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  sion cannot be.*
2140: 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20  *     valid for 
2150: 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20  new pages.  For 
2160: 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72  new pages inJour
2170: 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e  nal is always 0.
2180: 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a  .**.** dirty.**.
2190: 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72 75 65  **     When true
21a0: 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61  , this means tha
21b0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
21c0: 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
21d0: 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69  en.**     modifi
21e0: 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
21f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
2200: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2210: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20  file..**     If 
2220: 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20  false, it means 
2230: 74 68 61 74 20 65 69 74 68 65 72 20 74 68 65 20  that either the 
2240: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
2250: 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e  age is.**     un
2260: 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20  changed or else 
2270: 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75  the content is u
2280: 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77  nimportant and w
2290: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  e do not.**     
22a0: 63 61 72 65 20 77 68 65 74 68 65 72 20 6f 72 20  care whether or 
22b0: 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73 65 72  not it is preser
22c0: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79  ved..**.** alway
22d0: 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20  sRollback.**.** 
22e0: 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74      This means t
22f0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  hat the sqlite3P
2300: 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
2310: 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65  () API should be
2320: 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20  .**     ignored 
2330: 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e 20 20  for this page.  
2340: 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  The DontRollback
2350: 28 29 20 41 50 49 20 61 74 74 65 6d 70 74 73 20  () API attempts 
2360: 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68  to say.**     th
2370: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2380: 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69  f the page on di
2390: 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e  sk is unimportan
23a0: 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20  t (it is an.**  
23b0: 20 20 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f     unused page o
23c0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 20  n the freelist) 
23d0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 75 6e  so that it is un
23e0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a  necessary to .**
23f0: 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68       rollback ch
2400: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 70 61  anges to this pa
2410: 67 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ge because the c
2420: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2430: 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68  ge.**     can ch
2440: 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63 68 61  ange without cha
2450: 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e  nging the meanin
2460: 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
2470: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20  e.  This.**     
2480: 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73 20 61  flag overrides a
2490: 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  ny DontRollback(
24a0: 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73  ) attempt.  This
24b0: 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20   flag is set.** 
24c0: 20 20 20 20 77 68 65 6e 20 61 20 70 61 67 65 20      when a page 
24d0: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20  that originally 
24e0: 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20  contained valid 
24f0: 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
2500: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72 65 65  .**     the free
2510: 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20  list.  Later in 
2520: 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
2530: 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20  tion, this page 
2540: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20  might.**     be 
2550: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20  pulled from the 
2560: 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75  freelist and reu
2570: 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e  sed for somethin
2580: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20  g different.**  
2590: 20 20 20 61 6e 64 20 61 74 20 74 68 61 74 20 70     and at that p
25a0: 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c  oint the DontRol
25b0: 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c  lback() API will
25c0: 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75   be called becau
25d0: 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  se.**     pages 
25e0: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66  taken from the f
25f0: 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e  reelist do not n
2600: 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63  eed to be protec
2610: 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68  ted by.**     th
2620: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2630: 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c  al.  But this fl
2640: 61 67 20 73 61 79 73 20 74 68 61 74 20 74 68 65  ag says that the
2650: 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20   page was.**    
2660: 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20   not originally 
2670: 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2680: 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 20  list so that it 
2690: 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a  still needs to.*
26a0: 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20  *     be rolled 
26b0: 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
26c0: 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20   any subsequent 
26d0: 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
26e0: 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  alls..**.** need
26f0: 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Read .**.**     
2700: 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20  This flag means 
2710: 28 77 68 65 6e 20 74 72 75 65 29 20 74 68 61 74  (when true) that
2720: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2730: 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20  the page has.** 
2740: 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e      not yet been
2750: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73   loaded from dis
2760: 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72  k.  The in-memor
2770: 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73  y content is jus
2780: 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65  t.**     garbage
2790: 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65  .  (Actually, we
27a0: 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   zero the conten
27b0: 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c  t, but you shoul
27c0: 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b  d not.**     mak
27d0: 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e  e any assumption
27e0: 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  s about the cont
27f0: 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ent nevertheless
2800: 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20  .)  If the.**   
2810: 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65    content is nee
2820: 64 65 64 20 69 6e 20 74 68 65 20 66 75 74 75 72  ded in the futur
2830: 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  e, it should be 
2840: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  read from the.**
2850: 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61       original da
2860: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
2870: 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20  struct PgHdr {. 
2880: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
28b0: 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20  which this page 
28c0: 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e  belongs */.  Pgn
28d0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
2900: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
2910: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61    PgHdr *pNextHa
2920: 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20  sh, *pPrevHash; 
2930: 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69   /* Hash collisi
2940: 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48  on chain for PgH
2950: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67  dr.pgno */.  Pag
2960: 65 72 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20  erLruLink free; 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2980: 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73  ext and previous
2990: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
29a0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c   PgHdr *pNextAll
29b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c0: 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69   pages */.  u8 i
29e0: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
29f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
2a00: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
2a10: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
2a20: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
2a50: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
2a60: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
2a70: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
2aa0: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
2ab0: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
2ac0: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2ad0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2ae0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
2af0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
2b00: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
2b10: 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20 20 20  needRead;       
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b30: 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50  ead content if P
2b40: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
2b50: 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74  alled */.  short
2b60: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b80: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
2b90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
2ba0: 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70  gHdr *pDirty, *p
2bb0: 50 72 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a  PrevDirty;    /*
2bc0: 20 44 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   Dirty pages */.
2bd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2be0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
2bf0: 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72  GEMENT.  PagerLr
2c00: 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20  uLink gfree;    
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61          /* Globa
2c20: 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d  l list of nRef==
2c30: 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  0 pages */.#endi
2c40: 66 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  f.  u32 notUsed;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
2c70: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
2c80: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2c90: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
2ca0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2cb0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2cc0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
2cd0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
2ce0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
2cf0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
2d00: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
2d10: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
2d20: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
2d30: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
2d40: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
2d50: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
2d60: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2d70: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
2d80: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
2d90: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
2da0: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
2db0: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
2dc0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
2dd0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
2de0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
2df0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2e00: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
2e10: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
2e20: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
2e30: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
2e40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
2e50: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
2e60: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
2e70: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
2e80: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
2e90: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
2ea0: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
2eb0: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
2ec0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
2ed0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
2ee0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
2ef0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
2f00: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
2f10: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2f20: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2f30: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2f40: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2f50: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2f60: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2f70: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2f80: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2f90: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2fa0: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2fb0: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
2fc0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
2fd0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
2fe0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
2ff0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
3000: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
3010: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
3020: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
3030: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
3040: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
3050: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
3060: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
3070: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
3080: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
30b0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
30c0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
30d0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
30e0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
30f0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
3100: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
3110: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
3120: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
3130: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
3140: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
3150: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
3160: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
3170: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
3180: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
3190: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
31a0: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
31b0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
31c0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
31d0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
31e0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
31f0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
3200: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
3210: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
3220: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
3230: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
3240: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
3250: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
3260: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
3270: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
3280: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
3290: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
32a0: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
32b0: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
32c0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
32d0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
32e0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
32f0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
3300: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
3310: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
3320: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
3330: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
3340: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
3350: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
3360: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
3370: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
3380: 29 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  )..typedef struc
3390: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50  t PagerLruList P
33a0: 61 67 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72  agerLruList;.str
33b0: 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74  uct PagerLruList
33c0: 20 7b 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72   {.  PgHdr *pFir
33d0: 73 74 3b 0a 20 20 50 67 48 64 72 20 2a 70 4c 61  st;.  PgHdr *pLa
33e0: 73 74 3b 0a 20 20 50 67 48 64 72 20 2a 70 46 69  st;.  PgHdr *pFi
33f0: 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a 20  rstSynced;   /* 
3400: 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c 69  First page in li
3410: 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  st with PgHdr.ne
3420: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b 0a  edSync==0 */.};.
3430: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
3440: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
3450: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
3460: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3470: 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e  re..**.** Pager.
3480: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
3490: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
34a0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
34b0: 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c  PT, or.** or SQL
34c0: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
34d0: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
34e0: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
34f0: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
3500: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
3510: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
3520: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
3530: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
3540: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
3550: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
3560: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
3570: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
3580: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
3590: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
35a0: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
35b0: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
35c0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
35d0: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
35e0: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
35f0: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
3600: 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73  PagerGet() and s
3610: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
3620: 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65  p().** APIs, the
3630: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
3640: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
3650: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
3660: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
3670: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
3680: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
3690: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
36a0: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f  */.  u8 journalO
36b0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
36c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
36d0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
36e0: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
36f0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
3700: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
3710: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
3720: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
3730: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
3740: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
3750: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
3760: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
3770: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
3780: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
3790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
37a0: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
37b0: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
37c0: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
37d0: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
37e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
37f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3800: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
3810: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
3820: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
3830: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
3840: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
3850: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
3860: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
3870: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3880: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
3890: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
38a0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
38b0: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
38f0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
3900: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3910: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
3920: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
3930: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
3940: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e  ness */.  u8 syn
3950: 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  c_flags;        
3960: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3970: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
3980: 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38  YNC_FULL */.  u8
3990: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
39a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
39b0: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
39c0: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
39d0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  tc. */.  u8 temp
39e0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
39f0: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
3a00: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
3a10: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
3a20: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
3a30: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
3a40: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
3a50: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
3a60: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
3a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a80: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
3a90: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
3aa0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
3ab0: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
3ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3ad0: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
3ae0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
3af0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
3b00: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
3b10: 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f  * Disable DontRo
3b20: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
3b30: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
3b40: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b60: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b70: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
3b80: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
3b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3ba0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
3bb0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3bc0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
3bd0: 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20  doNotSync;      
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3bf0: 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c  ean. While true,
3c00: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   do not spill th
3c10: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20  e cache */.  u8 
3c20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
3c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3c40: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3c50: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3c60: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68 61  SIVE */.  u8 cha
3c70: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20  ngeCountDone;   
3c80: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74        /* Set aft
3c90: 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  er incrementing 
3ca0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
3cb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  er */.  int errC
3cc0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
3cd0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3ce0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3cf0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rrors */.  int d
3d00: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
3d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d20: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3d30: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
3d40: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
3d50: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
3d60: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
3d70: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
3d80: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3da0: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
3db0: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
3dc0: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
3dd0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3df0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
3e00: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
3e10: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
3e20: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
3e30: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
3e40: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
3e50: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
3e60: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
3e70: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
3e80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3e90: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
3ea0: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
3eb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ed0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3ee0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3ef0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3f00: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f20: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
3f30: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
3f40: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
3f70: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
3f80: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
3fb0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
3fc0: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
3fd0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
4000: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
4010: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
4020: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4040: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
4050: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
4060: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  base */.  u8 *aI
4070: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
4080: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
4090: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
40a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
40b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
40c0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
40d0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
40e0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
40f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
4100: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
4110: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
4120: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
4130: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4140: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4160: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
4170: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
4180: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
4190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
41a0: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
41b0: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
41c0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69   files */.  sqli
41d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a  te3_file *fd, *j
41e0: 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  fd;     /* File 
41f0: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
4200: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
4210: 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rnal */.  sqlite
4220: 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  3_file *stfd;   
4230: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
4240: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
4250: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
4260: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
4270: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
4280: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
4290: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
42a0: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65  andler */.  Page
42b0: 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20  rLruList lru;   
42c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c          /* LRU l
42d0: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
42e0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  s */.  PgHdr *pA
42f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
4300: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
4310: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
4320: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
4330: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
4340: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4350: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
4360: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
4370: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
4380: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4390: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
43a0: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
43b0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
43c0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
43d0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
43e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
43f0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
4400: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
4410: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
4420: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
4430: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
4440: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
4450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4460: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
4470: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
4480: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
4490: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
44b0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
44c0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
44d0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
44e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
44f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
4500: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
4510: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
4520: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
4530: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
4540: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
4550: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
4560: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4570: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
4580: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
4590: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
45a0: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
45b0: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
45c0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
45d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
45e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
45f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
4600: 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61  Destructor)(DbPa
4610: 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  ge*,int); /* Cal
4620: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
4630: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
4640: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
4650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
4660: 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c  ,int);   /* Call
4670: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4680: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
4690: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
46a0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
46b0: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
46c0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
46d0: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
46e0: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
46f0: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
4700: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
4710: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4720: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
4730: 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  dec() */.#endif.
4740: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
4770: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
4780: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
4790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
47a0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
47b0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
47c0: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
47d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
47e0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
47f0: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
4800: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4810: 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65   /* Doubly linke
4820: 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
4830: 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50   on which */.  P
4840: 61 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20  ager *pPrev;    
4850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
4860: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
4870: 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b  mory() will work
4880: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65   */.  int iInUse
4890: 4d 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  MM;             
48a0: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
48b0: 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20   unavailable to 
48c0: 4d 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55  MM */.  int iInU
48d0: 73 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20  seDB;           
48e0: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
48f0: 69 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65  if in sqlite3_re
4900: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a  lease_memory() *
4910: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
4920: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
4930: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
4940: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
4950: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
4960: 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  use */.  char db
4970: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
4980: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
4990: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
49a0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
49b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
49c0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
49d0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
49e0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
49f0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4a00: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4a10: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4a20: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4a30: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4a40: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4a50: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4a60: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4a70: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4a80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4a90: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4aa0: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4ab0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4ac0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4ad0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4ae0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4af0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4b00: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4b10: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4b20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4b30: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4b40: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4b50: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4b60: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4b70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4b80: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d  r_pgfree_count =
4b90: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ba0: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
4bb0: 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e  freed */.# defin
4bc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
4bd0: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
4be0: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4bf0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
4c00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
4c10: 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  riable points to
4c20: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64   the head of a d
4c30: 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73  ouble-linked lis
4c40: 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65  t.** of all page
4c50: 72 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67  rs that are elig
4c60: 69 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74  ible for page st
4c70: 65 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ealing by the.**
4c80: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
4c90: 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66  _memory() interf
4ca0: 61 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20  ace.  Access to 
4cb0: 74 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20  this list is.** 
4cc0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
4cd0: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54   SQLITE_MUTEX_ST
4ce0: 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e  ATIC_MEM2 mutex.
4cf0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4d00: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
4d10: 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69  MANAGEMENT.stati
4d20: 63 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  c Pager *sqlite3
4d30: 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73  PagerList = 0;.s
4d40: 74 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69  tatic PagerLruLi
4d50: 73 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67  st sqlite3LruPag
4d60: 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30  eList = {0, 0, 0
4d70: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  };.#endif.../*.*
4d80: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
4d90: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
4da0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
4db0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
4dc0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
4dd0: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
4de0: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
4df0: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
4e00: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
4e10: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
4e20: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
4e30: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
4e40: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
4e50: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
4e60: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
4e70: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
4e80: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
4e90: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
4ea0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
4eb0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
4ec0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
4ed0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
4ee0: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
4ef0: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
4f00: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
4f10: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
4f20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
4f30: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
4f40: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
4f50: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
4f60: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
4f70: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
4f80: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
4f90: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
4fa0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
4fb0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
4fc0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
4fd0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
4fe0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
4ff0: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
5000: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
5010: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
5020: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
5030: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
5040: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
5050: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
5060: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
5070: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5080: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
5090: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
50a0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
50b0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
50c0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
50d0: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
50e0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
50f0: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
5100: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
5110: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
5120: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
5130: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
5140: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
5150: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
5160: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
5170: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
5180: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
5190: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
51a0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
51b0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
51c0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
51d0: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
51e0: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
51f0: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
5200: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
5210: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
5220: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
5230: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
5240: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
5250: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
5260: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
5270: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
5280: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
5290: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
52a0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
52b0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
52c0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
52d0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
52e0: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
52f0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
5300: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
5310: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
5320: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
5330: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
5340: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
5350: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
5360: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
5370: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
5380: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
5390: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
53a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
53b0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
53c0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
53d0: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
53e0: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
53f0: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
5400: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
5410: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
5420: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
5430: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
5440: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
5450: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
5460: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
5470: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5480: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
5490: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
54a0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
54b0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
54c0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
54d0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
54e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
54f0: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
5500: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
5510: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
5520: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
5530: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
5540: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
5550: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
5560: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
5570: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
5580: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
5590: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
55a0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
55b0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
55c0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
55d0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
55e0: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
55f0: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
5600: 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  .** Page number 
5610: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73  PAGER_MJ_PGNO is
5620: 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61   never used in a
5630: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
5640: 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65  e (it is.** rese
5650: 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67  rved for working
5660: 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77   around a window
5670: 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74  s/posix incompat
5680: 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a  ibility). It is.
5690: 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a  ** used in the j
56a0: 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66  ournal to signif
56b0: 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  y that the remai
56c0: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
56d0: 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20  nal file .** is 
56e0: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
56f0: 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
5700: 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65  nal name - there
5710: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67   are no more pag
5720: 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61  es to.** roll ba
5730: 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ck. See comments
5740: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72   for function wr
5750: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
5760: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
5770: 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41  */./* #define PA
5780: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5790: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
57a0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f  )->pageSize)) */
57b0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
57c0: 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44  J_PGNO(x) ((PEND
57d0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
57e0: 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a  ageSize))+1)../*
57f0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
5800: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
5810: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
5820: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
5830: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
5840: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
5850: 20 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e   pagerEnter() an
5860: 64 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72  d pagerLeave() r
5870: 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20  outines acquire 
5880: 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61  and release.** a
5890: 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70   mutex on each p
58a0: 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78  ager.  The mutex
58b0: 20 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a   is recursive..*
58c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73  *.** This is a s
58d0: 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d  pecial-purpose m
58e0: 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70  utex.  It only p
58f0: 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65  rovides mutual e
5900: 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77  xclusion.** betw
5910: 65 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e  een the Btree an
5920: 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e  d the Memory Man
5930: 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  agement sqlite3_
5940: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
5950: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  .** function.  I
5960: 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65  t does not preve
5970: 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  nt, for example,
5980: 20 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d   two Btrees from
5990: 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68   accessing.** th
59a0: 65 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20  e same pager at 
59b0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
59c0: 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75  Other general-pu
59d0: 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e  rpose mutexes in
59e0: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
59f0: 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20  yer handle that 
5a00: 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  chore..*/.#ifdef
5a10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
5a20: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
5a30: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
5a40: 61 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20  agerEnter(Pager 
5a50: 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55  *p){.    p->iInU
5a60: 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20  seDB++;.    if( 
5a70: 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70  p->iInUseMM && p
5a80: 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b  ->iInUseDB==1 ){
5a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5aa0: 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20  utex *mutex;.   
5ab0: 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74     mutex = sqlit
5ac0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
5ad0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5ae0: 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20  IC_MEM2);.      
5af0: 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  p->iInUseDB = 0;
5b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5b10: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
5b20: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55  );.      p->iInU
5b30: 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20  seDB = 1;.      
5b40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5b50: 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ave(mutex);.    
5b60: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
5b70: 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a  >iInUseMM==0 );.
5b80: 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69    }.  static voi
5b90: 64 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67  d pagerLeave(Pag
5ba0: 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69  er *p){.    p->i
5bb0: 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61  InUseDB--;.    a
5bc0: 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65  ssert( p->iInUse
5bd0: 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  DB>=0 );.  }.#el
5be0: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
5bf0: 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69  rEnter(X).# defi
5c00: 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29  ne pagerLeave(X)
5c10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
5c20: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
5c30: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
5c40: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
5c50: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
5c60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
5c70: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
5c80: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
5c90: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
5ca0: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
5cb0: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
5cc0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
5cd0: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
5ce0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
5cf0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
5d00: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
5d10: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
5d20: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d   addr=%p nRef=%-
5d30: 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a  3d total=%d\n",.
5d40: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
5d50: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
5d60: 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50  , p->nRef, p->pP
5d70: 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ager->nRef.    )
5d80: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
5d90: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
5da0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
5db0: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
5dc0: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
5dd0: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
5de0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
5df0: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
5e00: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  ..static void li
5e10: 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69  stAdd(PagerLruLi
5e20: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
5e30: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
5e40: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70  PgHdr *pPg){.  p
5e50: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Link->pNext = 0;
5e60: 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  .  pLink->pPrev 
5e70: 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a  = pList->pLast;.
5e80: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c  .  if( pList->pL
5e90: 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ast ){.    int i
5ea0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
5eb0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
5ec0: 67 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c  g;.    PagerLruL
5ed0: 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d  ink *pLastLink =
5ee0: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
5ef0: 29 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d  )(&((u8 *)pList-
5f00: 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a  >pLast)[iOff]);.
5f10: 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70      pLastLink->p
5f20: 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65  Next = pPg;.  }e
5f30: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5f40: 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b  !pList->pFirst);
5f50: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72  .    pList->pFir
5f60: 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20  st = pPg;.  }.. 
5f70: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20   pList->pLast = 
5f80: 70 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73  pPg;.  if( !pLis
5f90: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
5fa0: 26 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  && pPg->needSync
5fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
5fc0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
5fd0: 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   pPg;.  }.}..sta
5fe0: 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d  tic void listRem
5ff0: 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74  ove(PagerLruList
6000: 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72   *pList, PagerLr
6010: 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67  uLink *pLink, Pg
6020: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
6030: 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29   iOff = (char *)
6040: 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29  pLink - (char *)
6050: 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 67 3d  pPg;..  if( pPg=
6060: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29  =pList->pFirst )
6070: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6080: 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  rst = pLink->pNe
6090: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  xt;.  }.  if( pP
60a0: 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  g==pList->pLast 
60b0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c  ){.    pList->pL
60c0: 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ast = pLink->pPr
60d0: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
60e0: 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ink->pPrev ){.  
60f0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6100: 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67  pPrevLink = (Pag
6110: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
6120: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65  u8 *)pLink->pPre
6130: 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  v)[iOff]);.    p
6140: 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  PrevLink->pNext 
6150: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
6160: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6170: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61  >pNext ){.    Pa
6180: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78  gerLruLink *pNex
6190: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
61a0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
61b0: 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69  )pLink->pNext)[i
61c0: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74  Off]);.    pNext
61d0: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Link->pPrev = pL
61e0: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
61f0: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6200: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
6210: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
6220: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
6230: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
6240: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
6250: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
6260: 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75   *pL = (PagerLru
6270: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
6280: 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  p)[iOff]);.     
6290: 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a   p = pL->pNext;.
62a0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
62b0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
62c0: 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d  p;.  }..  pLink-
62d0: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
62e0: 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pPrev = 0;.}../*
62f0: 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 74 6f   .** Add page to
6300: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 0a   the free-list .
6310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6320: 72 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20  ruListAdd(PgHdr 
6330: 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64  *pPg){.  listAdd
6340: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
6350: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6360: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6370: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6380: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6390: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
63a0: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
63b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
63c0: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
63d0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
63e0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
63f0: 0a 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71  .    listAdd(&sq
6400: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6410: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6420: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6430: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6440: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6450: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6460: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6470: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6480: 20 52 65 6d 6f 76 65 20 70 61 67 65 20 66 72 6f   Remove page fro
6490: 6d 20 66 72 65 65 2d 6c 69 73 74 20 0a 2a 2f 0a  m free-list .*/.
64a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c  static void lruL
64b0: 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72 20  istRemove(PgHdr 
64c0: 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d  *pPg){.  listRem
64d0: 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65 72  ove(&pPg->pPager
64e0: 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65  ->lru, &pPg->fre
64f0: 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20  e, pPg);.#ifdef 
6500: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
6510: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
6520: 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67    if( !pPg->pPag
6530: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
6540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6550: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
6560: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6570: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6580: 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f  ));.    listRemo
6590: 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61  ve(&sqlite3LruPa
65a0: 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66  geList, &pPg->gf
65b0: 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73  ree, pPg);.    s
65c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
65d0: 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
65e0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
65f0: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6600: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
6610: 2f 2a 20 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  /* .** Set the P
6620: 61 67 65 72 2e 70 46 69 72 73 74 53 79 6e 63 65  ager.pFirstSynce
6630: 64 20 76 61 72 69 61 62 6c 65 20 0a 2a 2f 0a 73  d variable .*/.s
6640: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6650: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
6660: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6670: 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  .  pPager->lru.p
6680: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
6690: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
66a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
66b0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
66c0: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
66d0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
66e0: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
66f0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6700: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
6710: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6720: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6730: 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  RU));.    for(p=
6740: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6750: 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20  st.pFirst; p && 
6760: 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70  p->needSync; p=p
6770: 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a  ->gfree.pNext);.
6780: 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50      assert(p==pP
6790: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
67a0: 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c  Synced || p==sql
67b0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
67c0: 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20  pFirstSynced);. 
67d0: 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67     sqlite3LruPag
67e0: 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63  eList.pFirstSync
67f0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69  ed = p;.    sqli
6800: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6820: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6830: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6840: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
6850: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
6860: 66 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20  f page *pPg has 
6870: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
6880: 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tten to the stat
6890: 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ement.** journal
68a0: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73   (or statement s
68b0: 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e  napshot has been
68c0: 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50   created, if *pP
68d0: 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  g is part.** of 
68e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
68f0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
6900: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74  c int pageInStat
6910: 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ement(PgHdr *pPg
6920: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
6930: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
6940: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
6950: 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44  .    return PGHD
6960: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
6970: 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a  Pager)->inStmt;.
6980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
6990: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
69a0: 6e 6f 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  no;.    u8 *a = 
69b0: 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b  pPager->aInStmt;
69c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 20 26  .    return (a &
69d0: 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
69e0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26  ger->stmtSize &&
69f0: 20 28 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31   (a[pgno/8] & (1
6a00: 3c 3c 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20  <<(pgno&7))));. 
6a10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
6a20: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ge the size of t
6a30: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
6a40: 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73  ble to N.  N mus
6a50: 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t be a power.** 
6a60: 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69  of two..*/.stati
6a70: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
6a80: 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50  ize_hash_table(P
6a90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6aa0: 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a  t N){.  PgHdr **
6ab0: 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61  aHash, *pPg;.  a
6ac0: 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e  ssert( N>0 && (N
6ad0: 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20  &(N-1))==0 );.  
6ae0: 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
6af0: 72 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71  r);.  aHash = sq
6b00: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
6b10: 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d   sizeof(aHash[0]
6b20: 29 2a 4e 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  )*N );.  pagerEn
6b30: 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
6b40: 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20  f( aHash==0 ){. 
6b50: 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
6b60: 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61   rehash is not a
6b70: 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20  n error.  It is 
6b80: 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e  only a performan
6b90: 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72  ce hit. */.    r
6ba0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
6bb0: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
6bc0: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
6bd0: 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20  er->nHash = N;. 
6be0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
6bf0: 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50   aHash;.  for(pP
6c00: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
6c10: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
6c20: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74  extAll){.    int
6c30: 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   h;.    if( pPg-
6c40: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
6c50: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
6c60: 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
6c70: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
6c80: 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   );.      contin
6c90: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20  ue;.    }.    h 
6ca0: 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e  = pPg->pgno & (N
6cb0: 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  -1);.    pPg->pN
6cc0: 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b  extHash = aHash[
6cd0: 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73  h];.    if( aHas
6ce0: 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48  h[h] ){.      aH
6cf0: 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
6d00: 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
6d10: 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50     aHash[h] = pP
6d20: 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  g;.    pPg->pPre
6d30: 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d  vHash = 0;.  }.}
6d40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
6d50: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
6d60: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
6d70: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
6d80: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
6d90: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
6da0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
6db0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
6dc0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
6dd0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
6de0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
6df0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
6e00: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
6e10: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
6e20: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
6e30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6e40: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
6e50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
6e60: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
6e70: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
6e80: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
6e90: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
6ea0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
6eb0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
6ec0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6ed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
6ee0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
6ef0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
6f00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f10: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
6f20: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
6f30: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
6f40: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
6f50: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
6f60: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
6f70: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
6f80: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
6f90: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
6fa0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
6fb0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
6fc0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
6fd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
6fe0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
6ff0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
7000: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
7010: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
7020: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
7030: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
7040: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
7050: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
7060: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
7070: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
7080: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
7090: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
70a0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
70b0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
70c0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
70d0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
70e0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
70f0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
7100: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
7110: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
7120: 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73  ( !pFd->pMethods
7130: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7140: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
7150: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
7160: 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63  Unlock(pFd, eLoc
7170: 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  k);.}../*.** Thi
7180: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
7190: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
71a0: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
71b0: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
71c0: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
71d0: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
71e0: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
71f0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
7200: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
7210: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7220: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
7230: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
7240: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
7250: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
7260: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
7270: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
7280: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
7290: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
72a0: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
72b0: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
72c0: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
72d0: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
72e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
72f0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
7300: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
7310: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
7320: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
7330: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
7340: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
7350: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
7360: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
7370: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
7380: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
7390: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
73a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
73b0: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
73c0: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
73d0: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
73e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
73f0: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
7400: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
7410: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
7420: 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20  .  int nSector; 
7430: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
7440: 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ize */.  int nPa
7450: 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ge;        /* Pa
7460: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c  ge size */.  sql
7470: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
7480: 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69  pPager->fd;..  i
7490: 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
74a0: 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  ){.    dc = sqli
74b0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
74c0: 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a  cteristics(fd);.
74d0: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71      nSector = sq
74e0: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
74f0: 65 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65  e(fd);.    nPage
7500: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
7510: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ize;.  }..  asse
7520: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7530: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
7540: 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53  >8));.  assert(S
7550: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7560: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
7570: 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e  ));..  if( !fd->
7580: 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26  pMethods || (dc&
7590: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
75a0: 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29  OMIC|(nPage>>8))
75b0: 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65  &&nSector<=nPage
75c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
75d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
75e0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
75f0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
7600: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7610: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7620: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
7630: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
7640: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hen an error occ
7650: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  urs within the p
7660: 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ager.** code. Th
7670: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
7680: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
7690: 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
76a0: 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63  ture, the.** sec
76b0: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
76c0: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
76d0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
76e0: 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
76f0: 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72   .** The value r
7700: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
7710: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
7720: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
7730: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
7740: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
7750: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
7760: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
7770: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
7780: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
7790: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
77a0: 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75  rsistent. All su
77b0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
77c0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
77d0: 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  .** will immedia
77e0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
77f0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  same error code.
7800: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7810: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
7820: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
7830: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
7840: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
7850: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
7860: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
7870: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
7880: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
7890: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
78a0: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
78b0: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
78c0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
78d0: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
78e0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
78f0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
7900: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
7910: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
7920: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
7930: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
7940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
7960: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
7970: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
7980: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
7990: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
79a0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
79b0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
79c0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
79d0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
79e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
79f0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
7a00: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
7a10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7a20: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
7a30: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
7a40: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
7a50: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
7a60: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
7a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
7a80: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
7a90: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
7aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
7ab0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
7ac0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
7ad0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
7ae0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
7af0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
7b00: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
7b10: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
7b20: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
7b30: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
7b40: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b60: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
7b70: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
7b80: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
7b90: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
7ba0: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
7bb0: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
7bc0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
7bd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
7be0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
7bf0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
7c00: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
7c10: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
7c20: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
7c30: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
7c40: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
7c50: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
7c60: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
7c70: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
7c80: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
7c90: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
7ca0: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
7cb0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7cc0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7cd0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
7ce0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
7cf0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
7d00: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
7d10: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
7d20: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
7d30: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
7d40: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
7d50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
7d60: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
7d70: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
7d80: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
7d90: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
7da0: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
7db0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
7dc0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
7dd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
7de0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
7df0: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
7e00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7e10: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
7e20: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
7e30: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
7e40: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
7e50: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
7e60: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
7e70: 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65  lloc(). *pzMaste
7e80: 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70  r is.** set to p
7e90: 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f  oint at the memo
7ea0: 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
7eb0: 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
7ec0: 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71  aller must.** sq
7ed0: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 2a 70 7a  lite3_free() *pz
7ee0: 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  Master..**.** If
7ef0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
7f00: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
7f10: 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65  present *pzMaste
7f20: 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  r is set to 0 an
7f30: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
7f40: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7f50: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
7f60: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
7f70: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
7f80: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
7f90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
7fa0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
7fb0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
7fc0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
7fd0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
7fe0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
7ff0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
8000: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
8010: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
8020: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8030: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8040: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8050: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8060: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8070: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8080: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8090: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
80a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
80b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
80c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
80d0: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
80e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
80f0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8100: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
8110: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
8120: 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d   aMagic, 8, szJ-
8130: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
8140: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
8150: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
8160: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
8170: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
8180: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
8190: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
81a0: 6f 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  o(len+1);.  if( 
81b0: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
81c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
81e0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
81f0: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
8200: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
8210: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
8220: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
8230: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 4d  qlite3_free(*pzM
8240: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
8250: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
8260: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
8270: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
8280: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
8290: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
82a0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
82b0: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
82c0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
82d0: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
82e0: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
82f0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
8300: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
8310: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
8320: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
8330: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
8340: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
8350: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8360: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
8370: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
8380: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
8390: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
83a0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
83b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
83c0: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
83d0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
83e0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
83f0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
8400: 33 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  3_free(*pzMaster
8410: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
8420: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8430: 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c     (*pzMaster)[l
8440: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  en] = '\0';.  }.
8450: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
8460: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8470: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
8480: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
8490: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
84a0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
84b0: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
84c0: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
84d0: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
84e0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
84f0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
8500: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
8510: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
8520: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
8530: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
8540: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
8560: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
8620: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b  static void seek
8630: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
8640: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
8650: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
8660: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
8670: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
8680: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
8690: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
86a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
86b0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
86c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
86d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
86e0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
86f0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
8700: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
8710: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
8720: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
8730: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8740: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
8750: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
8760: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
8770: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
8780: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
8790: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
87a0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
87b0: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
87c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
87d0: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
87e0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
87f0: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
8800: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8810: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
8820: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
8830: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
8840: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
8850: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
8860: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
8870: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
8880: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
8890: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
88a0: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
88b0: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
88c0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
88d0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
88e0: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
88f0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
8900: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
8910: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
8920: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
8930: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
8940: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
8950: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
8960: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
8970: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
8980: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
8990: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
89a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
89b0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
89c0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
89d0: 20 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73    char zHeader[s
89e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
89f0: 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20  gic)+16];.  int 
8a00: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
8a10: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
8a20: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8a30: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
8a40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
8a50: 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  .  }..  seekJour
8a60: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
8a70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8a80: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
8a90: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65  ournalOff;..  me
8aa0: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
8ab0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8ac0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8ad0: 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  c));..  /* .  **
8ae0: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
8af0: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
8b00: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
8b10: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
8b20: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
8b30: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
8b40: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
8b50: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
8b60: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
8b70: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
8b80: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
8b90: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
8ba0: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
8bb0: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
8bc0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
8bd0: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
8be0: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
8bf0: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
8c00: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
8c10: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
8c20: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
8c30: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
8c40: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
8c50: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
8c60: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
8c70: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
8c80: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
8c90: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
8ca0: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
8cb0: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
8cc0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
8cd0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
8ce0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
8cf0: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
8d00: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
8d10: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
8d20: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77  ailure occured w
8d30: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
8d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
8d50: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
8d60: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
8d70: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
8d80: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
8d90: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
8da0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
8db0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
8dc0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
8dd0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
8de0: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
8df0: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
8e00: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
8e10: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
8e20: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
8e30: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
8e40: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
8e50: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
8e60: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
8e70: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
8e80: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
8e90: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
8ea0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
8eb0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
8ec0: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
8ed0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
8ee0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20  ager->noSync);. 
8ef0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f   if( (pPager->no
8f00: 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71  Sync) .   || (sq
8f10: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
8f20: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
8f30: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
8f40: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
8f50: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74  D) .  ){.    put
8f60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
8f70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8f80: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
8f90: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
8fa0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8fb0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8fc0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b  rnalMagic)], 0);
8fd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
8fe0: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
8ff0: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
9000: 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d  .  sqlite3Random
9010: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
9020: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
9030: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
9040: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
9050: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9060: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9070: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
9080: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
9090: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
90a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
90b0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
90c0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
90d0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
90e0: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  >dbSize);.  /* T
90f0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
9100: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
9110: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
9120: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9130: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9140: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
9150: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
9160: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
9170: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
9180: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
9190: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65  journalHdr, size
91a0: 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20  of(zHeader))).  
91b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
91c0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
91d0: 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
91e0: 28 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72  (zHeader),pPager
91f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
9200: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9210: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
9220: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
9230: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
9240: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
9250: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
9260: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
9270: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
9280: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
9290: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
92a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
92b0: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
92c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
92d0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
92e0: 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22  JTAIL %p %lld\n"
92f0: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
9300: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29  ->journalOff-1))
9310: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9320: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9330: 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c  >jfd, "\000", 1,
9340: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9350: 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65  Off-1);.  }.  re
9360: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9370: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
9380: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
9390: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
93a0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
93b0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
93c0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
93d0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
93e0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
93f0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9400: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
9410: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
9420: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
9430: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
9440: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
9450: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
9460: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
9470: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
9480: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
9490: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
94a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
94b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
94c0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
94d0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
94e0: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
94f0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9500: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9510: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
9520: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
9530: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
9540: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
9550: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
9560: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
9570: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9580: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
9590: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
95a0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
95b0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
95c0: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
95d0: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
95e0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
95f0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
9600: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
9610: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
9620: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
9630: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
9640: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
9650: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9660: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
9670: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
9680: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
9690: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
96a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
96b0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
96c0: 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  e,.  u32 *pNRec,
96d0: 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65   .  u32 *pDbSize
96e0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
96f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
9700: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
9710: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
9720: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
9730: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
9740: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
9750: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
9760: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9770: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
9780: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
9790: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
97a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
97b0: 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  NE;.  }.  jrnlOf
97c0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
97d0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20  nalOff;..  rc = 
97e0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
97f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
9800: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
9810: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  ), jrnlOff);.  i
9820: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9830: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
9840: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a  sizeof(aMagic);.
9850: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
9860: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9870: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9880: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
9890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
98a0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
98b0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
98c0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
98d0: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
98e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
98f0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
9900: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
9910: 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72  nlOff+4, &pPager
9920: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
9930: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9940: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
9950: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9960: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70  fd, jrnlOff+8, p
9970: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
9980: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
9990: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
99a0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
99b0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
99c0: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
99d0: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
99e0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
99f0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
9a00: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
9a10: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
9a20: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
9a30: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
9a40: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
9a50: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
9a60: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
9a70: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
9a80: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
9a90: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
9aa0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
9ab0: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
9ac0: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
9ad0: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
9ae0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
9af0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
9b00: 2b 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61  +12, (u32 *)&pPa
9b10: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
9b20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
9b30: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
9b40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9b50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9b60: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
9b70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9b80: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
9b90: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
9ba0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
9bb0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9bc0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
9bd0: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
9be0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
9bf0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9c00: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
9c10: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
9c20: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
9c30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
9c40: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
9c50: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
9c60: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9c70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9c80: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
9c90: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
9ca0: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
9cb0: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
9cc0: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
9cd0: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
9ce0: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
9cf0: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
9d00: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
9d10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9d20: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
9d30: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
9d40: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
9d50: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
9d60: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
9d70: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9d80: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9d90: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9da0: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9db0: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
9dc0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
9dd0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  urnal name..**.*
9de0: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
9df0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
9e00: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
9e10: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
9e20: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
9e30: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
9e40: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
9e50: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
9e60: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
9e70: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
9e80: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
9e90: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
9ea0: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34  .  int i; .  i64
9eb0: 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20   jrnlOff;.  u32 
9ec0: 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61  cksum = 0;.  cha
9ed0: 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a  r zBuf[sizeof(aJ
9ee0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34  ournalMagic)+2*4
9ef0: 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ];..  if( !zMast
9f00: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
9f10: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
9f20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
9f30: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9f40: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
9f50: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
9f60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
9f70: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
9f80: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
9f90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
9fa0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
9fb0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
9fc0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
9fd0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
9fe0: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
9ff0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
a000: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
a010: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
a020: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
a030: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
a040: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
a050: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
a060: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
a070: 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61  {.    seekJourna
a080: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
a090: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
a0a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a0b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
a0c0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
a0d0: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
a0e0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a0f0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41  jfd, jrnlOff, PA
a100: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
a110: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
a120: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
a130: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
a140: 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73   += 4;..  rc = s
a150: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
a160: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
a170: 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66  er, len, jrnlOff
a180: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a190: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
a1a0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
a1b0: 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69   len;..  put32bi
a1c0: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
a1d0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
a1e0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
a1f0: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
a200: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
a210: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a220: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
a230: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
a240: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
a250: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
a260: 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  lMagic), jrnlOff
a270: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
a280: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
a290: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
a2a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
a2b0: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
a2c0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
a2d0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
a2e0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
a2f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
a300: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
a310: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
a320: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
a330: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
a340: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
a350: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a360: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
a370: 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
a380: 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20  StmtCommit().** 
a390: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
a3a0: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
a3b0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
a3c0: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
a3d0: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
a3e0: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
a3f0: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
a400: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
a410: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a420: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
a430: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
a440: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
a450: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
a460: 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70  ;.  PgHistory *p
a470: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
a480: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
a490: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  );.  assert( MEM
a4a0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69  DB );.  if( !pHi
a4b0: 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  st->inStmt ){.  
a4c0: 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
a4d0: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
a4e0: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
a4f0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
a500: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
a510: 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f  .      PGHDR_TO_
a520: 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74  HIST(pPager->pSt
a530: 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72  mt, pPager)->pPr
a540: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
a550: 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70    }.    pHist->p
a560: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
a570: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50  r->pStmt;.    pP
a580: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
a590: 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  g;.    pHist->in
a5a0: 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Stmt = 1;.  }.}.
a5b0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
a5c0: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
a5d0: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
a5e0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
a5f0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
a600: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
a610: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
a620: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
a630: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
a640: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a650: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
a660: 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  Hdr *p;.  if( pP
a670: 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29  ager->aHash==0 )
a680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
a690: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
a6a0: 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
a6b0: 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c  Hash-1)];.  whil
a6c0: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
a6d0: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
a6e0: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
a6f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
a700: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
a710: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a730: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
a740: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a750: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a760: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a770: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
a780: 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70        osUnlock(p
a790: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
a7a0: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
a7b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
a7c0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
a7d0: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
a7e0: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
a7f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
a800: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
a810: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
a820: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
a830: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
a840: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
a850: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
a860: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
a870: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
a880: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
a890: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
a8a0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
a8b0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
a8c0: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
a8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a8e0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
a8f0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
a900: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
a910: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
a920: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
a930: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
a940: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
a950: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
a960: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
a970: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
a980: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
a990: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
a9a0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
a9b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
a9c0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
a9d0: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
a9e0: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
a9f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
aa00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
aa10: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
aa20: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
aa30: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
aa40: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
aa50: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
aa60: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
aa70: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
aa80: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
aa90: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
aaa0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
aab0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
aac0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
aad0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
aae0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
aaf0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
ab00: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
ab10: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
ab20: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
ab30: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
ab40: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
ab50: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
ab60: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ab70: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
ab80: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ab90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
aba0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
abb0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
abc0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
abd0: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
abe0: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
abf0: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
ac00: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
ac10: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
ac20: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
ac30: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
ac40: 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
ac50: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
ac60: 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  3_free(pPg);.  }
ac70: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
ac80: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29  ->lru.pFirst==0)
ac90: 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
aca0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
acb0: 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72  ced==0);.  asser
acc0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c  t(pPager->lru.pL
acd0: 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65  ast==0);.  pPage
ace0: 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
acf0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
ad00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  ;.  pPager->nHas
ad10: 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  h = 0;.  sqlite3
ad20: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
ad30: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
ad40: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
ad50: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a  ger->aHash = 0;.
ad60: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
ad70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
ad80: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
ad90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41   transaction.  A
ada0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
adb0: 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a  ended by either.
adc0: 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  ** a COMMIT or a
add0: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
ade0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
adf0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
ae00: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
ae10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
ae20: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
ae30: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
ae40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
ae50: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
ae60: 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73  tine will releas
ae70: 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
ae80: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
ae90: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
aea0: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69  k in its place i
aeb0: 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65  f that is.** the
aec0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69   appropriate thi
aed0: 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61  ng to do.  Relea
aee0: 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79  se locks usually
aef0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c   is appropriate,
af00: 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72  .** unless we ar
af10: 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61  e in exclusive a
af20: 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e  ccess mode or un
af30: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a  less this is a .
af40: 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45  ** COMMIT AND BE
af50: 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  GIN or ROLLBACK 
af60: 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74  AND BEGIN operat
af70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ion..**.** The j
af80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65  ournal file is e
af90: 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72  ither deleted or
afa0: 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a   truncated..**.*
afb0: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
afc0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
afd0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
afe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
aff0: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
b000: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
b010: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
b020: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
b030: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
b040: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
b050: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
b060: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b070: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
b080: 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
b090: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
b0a0: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
b0b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
b0c0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
b0d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
b0e0: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
b0f0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
b100: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
b110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b120: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
b130: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
b140: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
b150: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26  ager->stmtOpen &
b160: 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
b170: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
b180: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
b190: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
b1a0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
b1b0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
b1c0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b1d0: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
b1e0: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
b1f0: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20  veMode .        
b200: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
b210: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b220: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
b230: 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20  QLITE_OK ){;.   
b240: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
b250: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
b260: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b270: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
b280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
b290: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
b2a0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
b2b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b2c0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
b2d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b2e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
b2f0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
b300: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
b310: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
b320: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
b330: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b340: 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  free( pPager->aI
b350: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
b360: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
b370: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
b380: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
b390: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
b3a0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
b3b0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
b3c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
b3d0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
b3e0: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
b3f0: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
b400: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
b410: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
b420: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
b430: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
b440: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
b450: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
b460: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
b470: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
b480: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
b490: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
b4a0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
b4c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
b4d0: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
b4e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b4f0: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
b500: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
b510: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
b520: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b530: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
b540: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
b550: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
b560: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
b570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
b580: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
b590: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
b5a0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
b5b0: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
b5c0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b5d0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
b5e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
b5f0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
b600: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
b610: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b620: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
b630: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
b640: 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20  ynced(pPager);. 
b650: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b660: 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20  = -1;..  return 
b670: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
b680: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
b690: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
b6a0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
b6b0: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
b6c0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
b6d0: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
b6e0: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
b6f0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
b700: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
b710: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
b720: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
b730: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
b740: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
b750: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
b760: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
b770: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
b780: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
b790: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
b7a0: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
b7b0: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
b7c0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
b7d0: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
b7e0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
b7f0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
b800: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
b810: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
b820: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
b830: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
b840: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
b850: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
b860: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
b870: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
b880: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
b890: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
b8a0: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
b8b0: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
b8c0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
b8d0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
b8e0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
b8f0: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
b900: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
b910: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
b920: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
b930: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
b940: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
b950: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
b960: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
b970: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
b980: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
b990: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
b9a0: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
b9b0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
b9c0: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
b9d0: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
b9e0: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
b9f0: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
ba00: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
ba10: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
ba20: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
ba30: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
ba40: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
ba50: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
ba60: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
ba70: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
ba80: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
ba90: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
baa0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
bab0: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
bac0: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
bad0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
bae0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
baf0: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
bb00: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bb10: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
bb20: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
bb30: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
bb40: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
bb50: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
bb60: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
bb70: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
bb80: 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
bb90: 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a  n(PgHdr*);../*.*
bba0: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
bbb0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
bbc0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
bbd0: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
bbe0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
bbf0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
bc00: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
bc10: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
bc20: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
bc30: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
bc40: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
bc50: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
bc60: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
bc70: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
bc80: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
bc90: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
bca0: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
bcb0: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
bcc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bcd0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
bce0: 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
bcf0: 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65  Pager, .  sqlite
bd00: 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69  3_file *jfd,.  i
bd10: 36 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74  64 offset,.  int
bd20: 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69   useCksum.){.  i
bd30: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
bd40: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
bd50: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
bd60: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
bd70: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
bd80: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
bd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
bda0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
bdb0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
bdc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
bdd0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
bde0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
bdf0: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
be00: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
be10: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
be20: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
be30: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
be40: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
be50: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b  e */..  /* useCk
be60: 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72  sum should be tr
be70: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
be80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
be90: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
bea0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
beb0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
bec0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
bed0: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
bee0: 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b  t( jfd == (useCk
bef0: 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  sum ? pPager->jf
bf00: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64  d : pPager->stfd
bf10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ) );.  assert( a
bf20: 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Data );..  rc = 
bf30: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
bf40: 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  offset, &pgno);.
bf50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bf60: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
bf70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
bf80: 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61  sRead(jfd, aData
bf90: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
bfa0: 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
bfb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bfc0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
bfd0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bfe0: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
bff0: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
c000: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
c010: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
c020: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
c030: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
c040: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
c050: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
c060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
c070: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
c080: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
c090: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
c0a0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
c0b0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
c0c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
c0d0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
c0e0: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
c0f0: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
c100: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
c110: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
c120: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
c130: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
c140: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
c150: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
c160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c170: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
c180: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
c190: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
c1a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c1b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
c1c0: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
c1d0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
c1e0: 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50  s(jfd, offset+pP
c1f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
c200: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
c210: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c220: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
c230: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
c240: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
c250: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
c260: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
c270: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c280: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
c290: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c2a0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
c2b0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
c2c0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
c2d0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
c2e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
c2f0: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
c300: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
c310: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
c320: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
c330: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
c340: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
c350: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
c360: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c370: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
c380: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
c390: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
c3a0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
c3b0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
c3c0: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
c3d0: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
c3e0: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
c3f0: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
c400: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
c410: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
c420: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
c430: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
c440: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
c450: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
c460: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
c470: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
c480: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
c490: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
c4a0: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
c4b0: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
c4c0: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
c4d0: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
c4e0: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
c4f0: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
c500: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
c510: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
c520: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
c530: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
c540: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
c550: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
c560: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
c570: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
c580: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
c590: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
c5a0: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
c5b0: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
c5c0: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
c5d0: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
c5e0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
c5f0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
c600: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
c610: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
c620: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
c630: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
c640: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
c650: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
c660: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
c670: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
c680: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
c690: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
c6a0: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
c6b0: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
c6c0: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
c6d0: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
c6e0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
c6f0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
c700: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
c710: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
c720: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
c730: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
c740: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
c750: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
c760: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
c770: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
c780: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
c790: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
c7a0: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
c7b0: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
c7c0: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
c7d0: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
c7e0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
c7f0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
c800: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
c810: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
c820: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
c830: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
c840: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
c850: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
c860: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
c870: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c880: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
c890: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
c8a0: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
c8b0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
c8c0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
c8d0: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
c8e0: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
c8f0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
c900: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
c910: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
c920: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
c930: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
c940: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
c950: 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  c==0..  */.  pPg
c960: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
c970: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
c980: 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c   PAGERTRACE4("PL
c990: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
c9a0: 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
c9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c9c0: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
c9d0: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
c9e0: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
c9f0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b  geSize, aData));
ca00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
ca10: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
ca20: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
ca30: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
ca40: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 36 34  c==0) ){.    i64
ca50: 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
ca60: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
ca70: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
ca80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
ca90: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
caa0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
cab0: 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
cac0: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
cad0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
cae0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
caf0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
cb00: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
cb10: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
cb20: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
cb30: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
cb40: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
cb50: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
cb60: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
cb70: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
cb80: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
cb90: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
cba0: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
cbb0: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
cbc0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
cbd0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
cbe0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
cbf0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
cc00: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
cc10: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
cc20: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
cc30: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
cc40: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
cc50: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
cc60: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
cc70: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
cc80: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
cc90: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
cca0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
ccb0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
ccc0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
ccd0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
cce0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
ccf0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
cd00: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
cd10: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
cd20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
cd30: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
cd40: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
cd50: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
cd60: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
cd70: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
cd80: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
cd90: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
cda0: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
cdb0: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
cdc0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
cdd0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
cde0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
cdf0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
ce00: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
ce10: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
ce20: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
ce30: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
ce40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
ce50: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
ce60: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
ce70: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
ce80: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
ce90: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
cea0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ceb0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
cec0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
ced0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
cee0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
cef0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
cf00: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
cf10: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
cf20: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
cf30: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
cf40: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
cf50: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
cf60: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
cf70: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
cf80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cf90: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
cfa0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
cfb0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
cfc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
cfd0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
cfe0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
cff0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
d000: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
d010: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
d020: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
d030: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
d040: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
d050: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
d060: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
d070: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
d080: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
d090: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
d0a0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
d0b0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
d0c0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
d0d0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
d0e0: 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
d0f0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
d100: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
d110: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
d120: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
d130: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
d140: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
d150: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
d160: 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65  Master;.  sqlite
d170: 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
d180: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
d190: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
d1a0: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
d1b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d1c0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
d1d0: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
d1e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
d1f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
d200: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
d210: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d220: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
d230: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
d240: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
d250: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
d260: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
d270: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
d280: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
d290: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ence..  */.  pMa
d2a0: 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
d2b0: 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  file *)sqlite3_m
d2c0: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
d2d0: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
d2e0: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
d2f0: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
d300: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
d310: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
d320: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
d330: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
d340: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
d350: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
d360: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
d370: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
d380: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
d390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d3a0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
d3b0: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
d3c0: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
d3d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d3e0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
d3f0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
d400: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
d410: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d420: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
d430: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
d440: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d450: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
d460: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
d470: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
d480: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
d490: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
d4a0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
d4b0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   0;..    /* Load
d4c0: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
d4d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d4e0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
d4f0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
d500: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d510: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
d520: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
d530: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
d540: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
d550: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
d560: 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  malloc(nMasterJo
d570: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
d580: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
d590: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
d5a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d5b0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
d5c0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
d5d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d5e0: 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
d5f0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
d600: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
d610: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d620: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
d630: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
d640: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
d650: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
d660: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
d670: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
d680: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
d690: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d6a0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
d6b0: 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
d6c0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
d6d0: 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  S) ){.        /*
d6e0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
d6f0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
d700: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
d710: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
d720: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
d730: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
d740: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
d750: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
d760: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
d770: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
d780: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
d790: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d7a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
d7b0: 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
d7c0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
d7d0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
d7e0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
d7f0: 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
d800: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d810: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
d820: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
d830: 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
d840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
d850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d860: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
d870: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
d880: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
d890: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
d8a0: 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
d8b0: 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  &zMasterPtr);.  
d8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
d8d0: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
d8e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d8f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d900: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
d910: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
d920: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
d930: 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20  = zMasterPtr!=0 
d940: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
d950: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
d960: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
d970: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 50  e3_free(zMasterP
d980: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tr);.        if(
d990: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
d9a0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
d9b0: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
d9c0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d9d0: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
d9e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
d9f0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
da00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
da10: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
da20: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
da30: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
da40: 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
da50: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
da60: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
da70: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
da80: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
da90: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
daa0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
dab0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
dac0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
dad0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
dae0: 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
daf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
db00: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
db10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
db20: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
db30: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
db40: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
db50: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
db60: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
db70: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
db80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
db90: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
dba0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
dbb0: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
dbc0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
dbd0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
dbe0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
dbf0: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
dc00: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
dc10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dc20: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
dc30: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
dc40: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70  R_EXCLUSIVE && p
dc50: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
dc60: 6f 64 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ods ){.    rc = 
dc70: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
dc80: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
dc90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
dca0: 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  i64)nPage);.  }.
dcb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dcc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
dcd0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
dce0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
dcf0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
dd00: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
dd10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
dd20: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
dd30: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
dd40: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
dd50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
dd60: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
dd70: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65  e sector size re
dd80: 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  ported.** by sql
dd90: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
dda0: 28 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53  () and the pageS
ddb0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ize..*/.static v
ddc0: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
ddd0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
dde0: 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  {.  assert(pPage
ddf0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
de00: 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
de10: 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
de20: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
de30: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
de40: 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
de50: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
de60: 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
de70: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
de80: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
de90: 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63  ened yet, in whc
dea0: 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ih case the OsSe
deb0: 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
dec0: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
ded0: 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
dee0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
def0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
df00: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
df10: 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
df20: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
df30: 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  ize<pPager->page
df40: 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Size ){.    pPag
df50: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
df60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
df70: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
df80: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
df90: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
dfa0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
dfb0: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
dfc0: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
dfd0: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
dfe0: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
dff0: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
e000: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
e010: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
e020: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
e030: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
e040: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
e050: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
e060: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
e070: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
e080: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
e090: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
e0a0: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
e0b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
e0c0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
e0d0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
e0e0: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
e0f0: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
e100: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e110: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e120: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
e130: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
e140: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
e150: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
e160: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
e170: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
e180: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
e190: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
e1a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
e1b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
e1c0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
e1d0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
e1e0: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
e1f0: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
e200: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
e210: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
e220: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
e230: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
e240: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
e250: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
e260: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
e270: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
e280: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
e290: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
e2a0: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
e2b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e2c0: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
e2d0: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
e2e0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
e2f0: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
e300: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
e310: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
e320: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
e330: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
e340: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
e350: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
e360: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
e370: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
e380: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
e390: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
e3a0: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
e3b0: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
e3c0: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
e3d0: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
e3e0: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
e3f0: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
e400: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
e410: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
e420: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
e430: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
e440: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
e450: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
e460: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
e470: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
e480: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
e490: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
e4a0: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
e4b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
e4c0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
e4d0: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
e4e0: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
e4f0: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
e500: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
e510: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
e520: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
e530: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
e540: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
e550: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
e560: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
e570: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
e580: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
e590: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e5a0: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
e5b0: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
e5c0: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
e5d0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
e5e0: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
e5f0: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
e600: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
e610: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e620: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
e630: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
e640: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
e650: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
e660: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
e670: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
e680: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
e690: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
e6a0: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
e6b0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
e6c0: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
e6d0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
e6e0: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
e6f0: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
e700: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
e710: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
e720: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
e730: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
e740: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
e750: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
e760: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
e770: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
e780: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
e790: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
e7a0: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
e7b0: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
e7c0: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
e7d0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
e7e0: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
e7f0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
e800: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
e810: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
e820: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
e830: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
e840: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
e850: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
e860: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
e870: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
e880: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
e890: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
e8a0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
e8b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e8c0: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
e8d0: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
e8e0: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
e8f0: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
e900: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
e910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
e920: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
e930: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
e940: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
e950: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
e960: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
e970: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
e980: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
e990: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
e9a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
e9b0: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
e9c0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
e9d0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
e9e0: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
e9f0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
ea00: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ea10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ea20: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ea30: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
ea40: 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
ea50: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
ea60: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
ea70: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
ea80: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ea90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
eaa0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
eab0: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
eac0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ead0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
eae0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
eaf0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
eb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
eb10: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
eb20: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
eb30: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
eb40: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
eb50: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
eb60: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
eb70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
eb80: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
eb90: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
eba0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
ebb0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
ebc0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ebd0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
ebe0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
ebf0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
ec00: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
ec10: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
ec20: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
ec30: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
ec40: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ec50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec60: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
ec70: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
ec80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
ec90: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
eca0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
ecb0: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
ecc0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
ecd0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
ece0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ecf0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
ed00: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
ed10: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
ed20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ed30: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
ed40: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
ed50: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
ed60: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
ed70: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
ed80: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
ed90: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
eda0: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
edb0: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
edc0: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
edd0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
ede0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
edf0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ee00: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
ee10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ee20: 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  .   || (zMaster 
ee30: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  && !sqlite3OsAcc
ee40: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
ee50: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
ee60: 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a  _EXISTS)) .  ){.
ee70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ee80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
ee90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
eea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
eeb0: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
eec0: 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
eed0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
eee0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
eef0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
ef00: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
ef10: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
ef20: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
ef30: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
ef40: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
ef50: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
ef60: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
ef70: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
ef80: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
ef90: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
efa0: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
efb0: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
efc0: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
efd0: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
efe0: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
eff0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
f000: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
f010: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
f020: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
f030: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
f040: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
f050: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
f060: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
f070: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
f080: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
f090: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
f0a0: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
f0b0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
f0c0: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
f0d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f0e0: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
f0f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f100: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
f110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
f130: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
f140: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f150: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
f160: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
f170: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
f180: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
f190: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
f1a0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
f1b0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
f1c0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
f1d0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
f1e0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
f1f0: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
f200: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
f210: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
f220: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
f230: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
f240: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
f250: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
f260: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
f270: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
f280: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f290: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
f2a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f2b0: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
f2c0: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
f2d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
f2e0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
f2f0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
f300: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
f310: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
f320: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
f330: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
f340: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
f350: 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
f360: 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
f370: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
f380: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
f390: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
f3a0: 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
f3b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
f3c0: 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
f3d0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
f3e0: 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
f3f0: 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
f400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
f410: 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
f420: 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
f430: 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
f440: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
f450: 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
f460: 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
f470: 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
f480: 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
f490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
f4a0: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
f4b0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
f4c0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
f4d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f4e0: 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
f4f0: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
f500: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
f510: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f520: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
f530: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
f540: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f550: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
f560: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
f570: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
f580: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
f590: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
f5a0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
f5b0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
f5c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f5d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
f5e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
f5f0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
f600: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
f610: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
f620: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f630: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f640: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
f650: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
f660: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
f670: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
f680: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
f690: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
f6a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f6b0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
f6c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
f6d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
f6e0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
f6f0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
f700: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
f710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f720: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
f730: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
f750: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
f760: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f780: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f790: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
f7a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f7b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f7c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f7d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
f7e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f7f0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
f800: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
f810: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
f820: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
f830: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f840: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
f850: 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
f860: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
f870: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
f880: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
f890: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
f8a0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
f8b0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
f8c0: 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
f8d0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
f8e0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
f8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
f900: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
f910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f920: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
f930: 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
f940: 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
f950: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
f960: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
f970: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
f980: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
f990: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
f9a0: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
f9b0: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
f9c0: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
f9d0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
f9e0: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
f9f0: 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
fa00: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
fa10: 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
fa20: 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
fa30: 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
fa40: 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
fa50: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
fa60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fa70: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
fa80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
fa90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
faa0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
fab0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
fac0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
fad0: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
fae0: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
faf0: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
fb00: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
fb10: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
fb20: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
fb30: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
fb40: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
fb50: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
fb60: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
fb70: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
fb80: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
fb90: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
fba0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
fbb0: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
fbc0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
fbd0: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
fbe0: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
fbf0: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
fc00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
fc10: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
fc20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
fc30: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
fc40: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
fc50: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
fc60: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
fc70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
fc80: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
fc90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
fca0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
fcb0: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
fcc0: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fce0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
fcf0: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
fd20: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
fd30: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
fd40: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
fd50: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
fd60: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
fd70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fd80: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
fd90: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
fda0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fdb0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
fdc0: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
fdd0: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
fde0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
fdf0: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
fe00: 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74   the offset just
fe10: 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
fe20: 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e  f the last journ
fe30: 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69  al.  ** page wri
fe40: 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tten before the 
fe50: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
fe60: 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74  ader for this st
fe70: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
fe80: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69  nsaction was wri
fe90: 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tten, or the end
fea0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
feb0: 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
fec0: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
fed0: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
fee0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
fef0: 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
ff00: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
ff10: 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
ff20: 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
ff30: 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
ff40: 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
ff50: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
ff60: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
ff70: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
ff80: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
ff90: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
ffa0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  er, pPager->stmt
ffb0: 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
ffc0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ffd0: 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
ffe0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
fff0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
10000 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
10010 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
10020 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10030 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
10040 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
10050 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65  nalOpen );.  nRe
10060 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
10070 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
10080 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
10090 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
100a0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
100b0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
100c0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
100d0 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
100e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
100f0 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
10100 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
10110 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
10120 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
10130 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
10140 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
10150 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
10160 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
10170 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
10180 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  +){.    i64 offs
10190 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72  et = i*(4+pPager
101a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
101b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
101c0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
101d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
101e0 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a  fd, offset, 0);.
101f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
10200 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
10210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10220 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
10230 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
10240 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
10250 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
10260 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
10270 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
10280 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
10290 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
102a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
102b0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
102c0 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
102d0 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
102e0 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
102f0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
10300 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
10310 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
10320 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
10330 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
10340 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
10350 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
10360 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
10370 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
10380 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10390 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
103a0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
103b0 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
103c0 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
103d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
103e0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
103f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
10400 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
10410 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
10420 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
10430 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
10440 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
10450 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
10460 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
10470 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
10480 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
10490 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
104a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
104b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
104c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
104d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
104e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
104f0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
10500 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
10510 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10520 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
10530 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
10540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
10550 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
10560 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
10570 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
10580 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
10590 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
105a0 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
105b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
105c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
105d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
105e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
105f0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
10600 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
10610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
10620 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
10630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
10640 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
10650 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
10660 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
10670 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
10680 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
10690 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
106a0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
106b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
106c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
106d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106e0 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  Off, 1);.      a
106f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
10700 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
10710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10720 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
10730 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
10740 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
10750 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
10760 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
10770 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
10780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
10790 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
107a0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
107b0 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
107c0 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
107d0 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
107e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
107f0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
10800 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
10810 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
10820 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
10830 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
10840 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
10850 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
10860 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
10870 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
10880 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
10890 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
108a0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
108b0 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
108c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
108d0 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
108e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
108f0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
10900 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
10910 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
10920 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
10930 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
10940 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
10950 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
10960 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
10970 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
10980 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
10990 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
109a0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
109b0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
109c0 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
109d0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
109e0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
109f0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
10a00 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
10a10 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
10a20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
10a30 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
10a40 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
10a50 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
10a60 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
10a70 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
10a80 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
10a90 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
10aa0 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
10ab0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
10ac0 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
10ad0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10ae0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
10af0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
10b00 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
10b10 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
10b20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
10b30 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
10b40 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
10b50 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
10b70 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
10b80 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
10b90 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
10ba0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
10bb0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
10bc0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
10bd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
10be0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
10bf0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
10c00 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
10c10 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
10c20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
10c30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10c40 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
10c50 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
10c60 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
10c70 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
10c80 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
10c90 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
10ca0 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
10cb0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
10cc0 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
10cd0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
10ce0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
10cf0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
10d00 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
10d10 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
10d20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
10d30 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
10d40 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
10d50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
10d60 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
10d70 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
10d80 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
10d90 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
10da0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
10db0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
10dc0 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
10dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
10de0 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
10df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10e00 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
10e10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
10e20 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
10e30 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
10e40 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
10e50 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
10e60 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
10e70 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
10e80 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
10e90 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
10ea0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
10eb0 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f  s = (full_fsync?
10ec0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
10ed0 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
10ee0 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
10ef0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
10f00 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
10f10 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
10f20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
10f30 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
10f40 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
10f50 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
10f60 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
10f70 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
10f80 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
10f90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
10fa0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
10fb0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
10fc0 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
10fd0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
10fe0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
10ff0 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
11000 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
11010 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
11020 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
11030 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
11040 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
11050 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11060 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
11070 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
11080 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
11090 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
110a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
110b0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
110c0 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  ry.** file when 
110d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
110e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
110f0 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6e 20 61   is 0, then an a
11100 70 70 72 6f 70 72 69 61 74 65 20 74 65 6d 70 6f  ppropriate tempo
11110 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 69 73  rary filename is
11120 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 61 75  .** generated au
11130 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 6e 64 20  tomatically and 
11140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
11150 4a 4f 55 52 4e 41 4c 20 69 73 20 70 61 73 73 65  JOURNAL is passe
11160 64 20 74 6f 0a 2a 2a 20 74 68 65 20 4f 53 20 6c  d to.** the OS l
11170 61 79 65 72 20 61 73 20 74 68 65 20 66 69 6c 65  ayer as the file
11180 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   type..**.** If 
11190 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 6e 6f 74  zFilename is not
111a0 20 30 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   0, SQLITE_OPEN_
111b0 54 45 4d 50 5f 44 42 20 69 73 20 70 61 73 73 65  TEMP_DB is passe
111c0 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 79  d as the file ty
111d0 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
111e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
111f0 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65  entemp(.  sqlite
11200 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
11210 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
11220 69 6c 65 2c 20 0a 20 20 63 68 61 72 20 2a 7a 46  ile, .  char *zF
11230 69 6c 65 6e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74  ilename.){.  int
11240 20 72 63 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73   rc;.  int flags
11250 20 3d 20 28 0a 20 20 20 20 20 53 51 4c 49 54 45   = (.     SQLITE
11260 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
11270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
11280 54 45 7c 0a 20 20 20 20 20 53 51 4c 49 54 45 5f  TE|.     SQLITE_
11290 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
112a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
112b0 45 4f 4e 43 4c 4f 53 45 0a 20 20 29 3b 0a 0a 20  EONCLOSE.  );.. 
112c0 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30   char *zFree = 0
112d0 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
112e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 72 65  e==0 ){.    zFre
112f0 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
11300 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d  te3_malloc(pVfs-
11310 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  >mxPathname);.  
11320 20 20 69 66 28 20 21 7a 46 72 65 65 20 29 7b 0a    if( !zFree ){.
11330 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11340 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
11350 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
11360 20 7a 46 72 65 65 3b 0a 20 20 20 20 66 6c 61 67   zFree;.    flag
11370 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
11380 5f 53 55 42 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  _SUBJOURNAL;.   
11390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47   rc = sqlite3OsG
113a0 65 74 54 65 6d 70 4e 61 6d 65 28 70 56 66 73 2c  etTempName(pVfs,
113b0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
113c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
113d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
113e0 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b  te3_free(zFree);
113f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11400 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
11410 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
11420 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
11430 42 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  B;.  }..#ifdef S
11440 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
11450 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
11460 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
11470 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
11480 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
11490 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20  .#endif..  rc = 
114a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
114b0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  fs, zFilename, p
114c0 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 29 3b  File, flags, 0);
114d0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
114e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c  QLITE_OK || pFil
114f0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  e->pMethods );. 
11500 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
11510 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ree);.  return r
11520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
11530 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
11540 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
11550 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
11560 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
11570 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
11580 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
11590 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
115a0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
115b0 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
115c0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
115d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
115e0 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
115f0 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
11600 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
11610 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
11620 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
11630 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
11640 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
11650 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
11660 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
11670 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
11680 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
11690 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
116a0 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
116b0 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
116c0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
116d0 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
116e0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
116f0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
11700 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
11710 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
11720 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
11730 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
11740 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
11750 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
11760 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
11770 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
11780 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
11790 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
117a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
117b0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
117c0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
117d0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
117e0 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
117f0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
11800 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
11810 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
11820 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11830 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
11840 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11850 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
11860 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
11870 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11880 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
11890 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
118a0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
118b0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
118c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
118d0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
118e0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
118f0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
11900 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a  er *pPager = 0;.
11910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11920 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
11930 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
11940 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
11950 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
11960 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
11970 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
11980 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
11990 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
119a0 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
119b0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
119c0 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
119d0 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
119e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f  Size = sqlite3Jo
119f0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b  urnalSize(pVfs);
11a00 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c 74 50  .  int nDefaultP
11a10 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  age = SQLITE_DEF
11a20 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
11a30 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
11a40 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  e;.  int nPathna
11a50 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  me;..  /* The de
11a60 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20  fault return is 
11a70 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a  a NULL pointer *
11a80 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
11a90 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
11aa0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
11ab0 65 20 2a 2f 0a 20 20 7a 50 61 74 68 6e 61 6d 65  e */.  zPathname
11ac0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
11ad0 63 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  c(pVfs->mxPathna
11ae0 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 7a 50 61  me+1);.  if( zPa
11af0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
11b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11b10 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
11b20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
11b30 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
11b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11b50 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
11b60 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
11b70 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
11b80 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
11b90 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
11ba0 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
11bb0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
11bc0 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
11bd0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
11be0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
11bf0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
11c00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
11c10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11c20 65 33 4f 73 47 65 74 54 65 6d 70 4e 61 6d 65 28  e3OsGetTempName(
11c30 70 56 66 73 2c 20 7a 50 61 74 68 6e 61 6d 65 29  pVfs, zPathname)
11c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
11c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
11c70 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
11c80 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
11c90 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65  Pathname = strle
11ca0 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  n(zPathname);.. 
11cb0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
11cc0 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  ory for the page
11cd0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
11ce0 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
11cf0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
11d00 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
11d10 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
11d20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
11d30 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
11d40 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20  leSize +        
11d50 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
11d60 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  l file structure
11d70 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73   */ .    pVfs->s
11d80 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b 20 20 20  zOsFile * 2 +   
11d90 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62 20 61       /* The db a
11da0 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  nd stmt journal 
11db0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
11dc0 61 74 68 6e 61 6d 65 20 2a 20 33 20 2b 20 33 30  athname * 3 + 30
11dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
11de0 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
11df0 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  ry, zJournal */.
11e00 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67    );.  if( !pPag
11e10 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
11e20 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
11e30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11e40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11e50 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26    pPtr = (u8 *)&
11e60 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
11e70 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74  ger->fd = (sqlit
11e80 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
11e90 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d  Vfs->szOsFile*0]
11ea0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64  ;.  pPager->stfd
11eb0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
11ec0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
11ed0 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61  OsFile*1];.  pPa
11ee0 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69  ger->jfd = (sqli
11ef0 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
11f00 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32  pVfs->szOsFile*2
11f10 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  ];.  pPager->zFi
11f20 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
11f30 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
11f40 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69  File*2+journalFi
11f50 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
11f60 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
11f70 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
11f80 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  me[nPathname+1];
11f90 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
11fa0 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
11fb0 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e  Directory[nPathn
11fc0 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ame+1];.  pPager
11fd0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
11fe0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
11ff0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
12000 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
12010 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
12020 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  ee(zPathname);..
12030 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
12040 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
12050 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
12060 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
12070 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
12080 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70  if( nPathname>(p
12090 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
120a0 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e  - sizeof("-journ
120b0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72  al")) ){.      r
120c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
120d0 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  PEN;.    }else{.
120e0 2f 2a 2a 2a 20 20 46 49 58 4d 45 3a 20 20 4d 69  /***  FIXME:  Mi
120f0 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 53  ght need to be S
12100 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
12110 44 42 2e 20 20 4e 65 65 64 20 74 6f 20 70 61 73  DB.  Need to pas
12120 73 20 69 6e 0a 2a 2a 2a 2a 20 61 20 66 6c 61 67  s in.**** a flag
12130 20 66 72 6f 6d 20 68 69 67 68 65 72 20 75 70 2e   from higher up.
12140 0a 2a 2a 2a 2a 2f 0a 20 20 20 20 20 20 69 6e 74  .****/.      int
12150 20 6f 66 6c 61 67 20 3d 20 0a 20 20 20 20 20 20   oflag = .      
12160 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
12170 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
12180 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
12190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
121a0 5f 44 42 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  _DB);.      int 
121b0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
121c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
121d0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
121e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
121f0 65 72 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c 20 26  er->fd, oflag, &
12200 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61  fout);.      rea
12210 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
12220 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
12230 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  LY);..      /* I
12240 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
12250 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
12260 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
12270 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20  e access,.      
12280 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
12290 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
122a0 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
122b0 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
122c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
122d0 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
122e0 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
122f0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
12300 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
12310 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
12320 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
12330 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
12340 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
12350 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
12360 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a  rSize().      **
12370 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
12380 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
12390 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
123a0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
123b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
123c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123d0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
123e0 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72       int iSector
123f0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
12400 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12410 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
12420 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65  if( nDefaultPage
12430 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
12440 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75            nDefau
12450 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72  ltPage = iSector
12460 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
12470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12480 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
12490 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
124a0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
124b0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
124c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
124d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
124e0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
124f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
12500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
12510 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
12520 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
12530 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
12540 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
12550 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
12560 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
12570 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
12580 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
12590 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
125a0 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69  nDefaultPage; ii
125b0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
125c0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
125d0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
125e0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
125f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
12600 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44  IC|(ii>>8)) ) nD
12610 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b  efaultPage = ii;
12620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12630 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12640 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61 75        if( nDefau
12650 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41  ltPage>SQLITE_MA
12660 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
12670 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
12680 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
12690 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
126a0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
126b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
126c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
126d0 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
126e0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
126f0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
12700 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
12710 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
12720 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
12730 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
12740 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
12750 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
12760 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
12770 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
12780 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
12790 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
127a0 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  e()..    */ .   
127b0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
127c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
127d0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
127e0 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
127f0 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
12800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
12810 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
12820 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
12830 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c  3_malloc(nDefaul
12840 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tPage);.  }..  /
12850 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12860 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
12870 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
12880 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74  ove..  ** Free t
12890 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
128a0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
128b0 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63   file..  ** Sinc
128c0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
128d0 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
128e0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
128f0 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
12900 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
12910 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
12920 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70  f( !pPager || !p
12930 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
12940 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12950 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
12960 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
12970 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
12980 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
12990 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
129a0 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
129b0 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
129c0 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
129d0 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
129e0 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
129f0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49  >zFilename);.  I
12a00 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
12a10 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
12a20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
12a30 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
12a40 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
12a50 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
12a60 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
12a70 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
12a80 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
12a90 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  e+1);.  for(i=st
12aa0 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69  rlen(pPager->zDi
12ab0 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26  rectory); i>0 &&
12ac0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
12ad0 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
12ae0 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
12af0 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
12b00 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a  tory[i-1] = 0;..
12b10 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67    /* Fill in Pag
12b20 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f  er.zJournal[] */
12b30 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
12b40 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
12b50 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
12b60 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d  Pathname);.  mem
12b70 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
12b80 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
12b90 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
12ba0 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  ;..  /* pPager->
12bb0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
12bc0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
12bd0 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
12be0 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
12bf0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
12c00 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
12c10 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
12c20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
12c30 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
12c40 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
12c50 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
12c60 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
12c70 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
12c80 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
12c90 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
12ca0 65 53 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74  eSize = nDefault
12cb0 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Page;.  /* pPage
12cc0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
12cd0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
12ce0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
12cf0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
12d00 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
12d10 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
12d20 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   100;.  pPager->
12d30 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
12d40 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
12d50 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
12d60 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
12d70 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  K; */.  assert( 
12d80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
12d90 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
12da0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
12db0 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
12dc0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
12dd0 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
12de0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12df0 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  = tempFile;.  as
12e00 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
12e10 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
12e20 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
12e30 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
12e40 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
12e50 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
12e60 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
12e70 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
12e80 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
12e90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
12ea0 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20  ode = tempFile; 
12eb0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
12ec0 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
12ed0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
12ee0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
12ef0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
12f00 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
12f10 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
12f20 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
12f30 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
12f40 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
12f50 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f  (pPager->noSync?
12f60 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  0:1);.  pPager->
12f70 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
12f80 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
12f90 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
12fa0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
12fb0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
12fc0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
12fd0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
12fe0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
12ff0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
13000 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
13010 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70  tra);.  assert(p
13020 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
13030 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70  ods||memDb||temp
13040 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65  File);.  if( !me
13050 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65  mDb ){.    setSe
13060 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
13070 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
13080 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
13090 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
130a0 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
130b0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
130c0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
130d0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
130e0 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  ager;.#ifdef SQL
130f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
13100 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70  Y_MANAGEMENT.  p
13110 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
13120 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69  = 0;.  pPager->i
13130 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69  InUseDB = 0;.  i
13140 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
13150 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13160 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
13170 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
13180 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13190 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  MEM2);.    sqlit
131a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
131b0 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65  utex);.    pPage
131c0 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  r->pNext = sqlit
131d0 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20  e3PagerList;.   
131e0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
131f0 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  rList ){.      a
13200 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
13210 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d  gerList->pPrev==
13220 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
13230 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72  e3PagerList->pPr
13240 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  ev = pPager;.   
13250 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
13260 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71  Prev = 0;.    sq
13270 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
13280 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c   pPager;.    sql
13290 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
132a0 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e  (mutex);.  }.#en
132b0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
132c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
132d0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
132e0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
132f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
13300 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
13310 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
13320 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
13330 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
13340 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
13350 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
13360 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
13370 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
13380 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
13390 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
133a0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
133b0 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
133c0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
133d0 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
133e0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
133f0 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
13400 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
13410 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
13420 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
13430 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
13440 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
13450 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
13460 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
13470 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
13480 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
13490 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
134a0 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
134b0 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
134c0 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
134d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
134e0 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72  gerSetDestructor
134f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13500 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
13510 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
13520 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
13530 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
13540 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
13550 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
13560 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
13570 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
13580 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
13590 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
135a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
135b0 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
135c0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
135d0 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
135e0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
135f0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
13600 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
13610 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
13620 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
13630 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
13640 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
13650 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
13660 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
13670 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
13680 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
13690 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
136a0 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
136b0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
136c0 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
136d0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
136e0 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
136f0 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
13700 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
13710 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65  ew size.  If the
13720 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67   suggest new pag
13730 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61  e.** size is ina
13740 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e  ppropriate, then
13750 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
13760 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c  page size is sel
13770 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74  ected.** and ret
13780 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
13790 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
137a0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
137b0 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
137c0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
137d0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
137e0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
137f0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
13800 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
13810 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
13820 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
13830 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
13840 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ef==0 ){.    pag
13850 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
13860 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
13870 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
13880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
13890 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 73   pageSize;.    s
138a0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
138b0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c  ger);.    pagerL
138c0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
138d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
138e0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
138f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
13900 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
13910 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69  e3_malloc(pageSi
13920 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
13930 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
13940 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ze;.}../*.** Att
13950 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
13960 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
13970 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
13980 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
13990 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
139a0 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
139b0 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
139c0 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
139d0 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
139e0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
139f0 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
13a00 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
13a10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
13a20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
13a30 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
13a40 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
13a50 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
13a60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13a70 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
13a80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13a90 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
13aa0 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
13ab0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
13ac0 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71  mxPage;.  }.  sq
13ad0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
13ae0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72  unt(pPager);.  r
13af0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
13b00 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
13b10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
13b20 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
13b30 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
13b40 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
13b50 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
13b60 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
13b70 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
13b80 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
13b90 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
13ba0 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
13bb0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
13bc0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
13bd0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
13be0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
13bf0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
13c00 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
13c10 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
13c20 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
13c30 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
13c40 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
13c50 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
13c60 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
13c70 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
13c80 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
13c90 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
13ca0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
13cb0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
13cc0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
13cd0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
13ce0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
13cf0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
13d00 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
13d10 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
13d20 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
13d30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
13d40 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
13d50 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
13d60 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
13d70 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13d80 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
13d90 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
13da0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
13db0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
13dc0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
13dd0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
13de0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
13df0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
13e00 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
13e10 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
13e20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
13e30 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
13e40 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
13e50 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
13e60 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
13e70 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
13e80 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
13e90 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
13ea0 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
13eb0 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
13ec0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
13ed0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
13ee0 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
13ef0 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
13f00 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
13f10 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
13f20 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
13f30 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
13f40 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
13f50 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
13f60 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
13f70 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
13f80 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
13f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13fa0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
13fb0 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
13fc0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
13fd0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
13fe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13ff0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
14000 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
14010 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50  assert(MEMDB||pP
14020 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
14030 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
14040 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61  File);.  if( pPa
14050 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14060 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  s ){.    IOTRACE
14070 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
14080 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
14090 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
140a0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
140b0 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
140c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
140d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
140e0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
140f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14110 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
14120 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
14130 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
14140 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
14150 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14160 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
14170 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
14180 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
14190 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
141a0 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
141b0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
141c0 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
141d0 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
141e0 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
141f0 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
14200 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
14210 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
14220 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
14230 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
14240 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
14250 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
14260 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
14270 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
14280 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
14290 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
142a0 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
142b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
142c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
142d0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
142e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
142f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14300 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
14310 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
14320 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
14330 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
14340 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
14350 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
14360 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
14370 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  e);.    if( (pPa
14380 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14390 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d  s).     && (rc =
143a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
143b0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
143c0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
143d0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
143e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
143f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
14400 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
14410 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
14420 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
14430 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
14440 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
14450 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
14460 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14470 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
14480 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
14490 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
144a0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
144b0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
144c0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
144d0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
144e0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
144f0 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
14500 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
14510 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
14520 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
14530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14540 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
14550 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
14560 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
14570 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
14580 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
14590 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
145a0 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
145b0 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
145c0 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
145d0 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
145e0 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
145f0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
14600 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
14610 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
14620 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
14630 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
14640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14650 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
14660 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
14670 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
14680 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
14690 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
146a0 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
146b0 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
146c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
146d0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
146e0 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
146f0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
14700 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
14710 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75  erMovepage() rou
14720 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61  tine can leave a
14730 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
14740 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76   pNextFree/pPrev
14750 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69  Free list that i
14760 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  s not a part of 
14770 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a  any hash-chain..
14780 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
14790 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50  nlinkHashChain(P
147a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
147b0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
147c0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
147d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
147e0 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
147f0 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
14800 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
14810 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
14820 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
14830 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
14840 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
14850 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
14860 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
14870 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
14880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
14890 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26  Hash[pPg->pgno &
148a0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
148b0 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  1)]!=pPg );.    
148c0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
148d0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
148e0 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
148f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
14900 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50   pPg->pgno & (pP
14910 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
14920 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
14930 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
14940 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  tHash;.  }.  if(
14950 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c   MEMDB ){.    cl
14960 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
14970 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
14980 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50  ager));.  }.  pP
14990 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
149a0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
149b0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
149c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
149d0 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
149e0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
149f0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
14a00 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
14a10 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
14a20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
14a30 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
14a40 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
14a50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
14a60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14a70 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
14a80 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
14a90 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69 73 74  m free page list
14aa0 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d   */.  lruListRem
14ab0 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  ove(pPg);..  /* 
14ac0 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
14ad0 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
14ae0 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
14af0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
14b00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14b10 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
14b20 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
14b30 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61   cache when a da
14b40 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75  tabase.** is tru
14b50 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72  ncated.  Drop fr
14b60 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c  om the cache all
14b70 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e   pages whose pgn
14b80 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74  o is.** larger t
14b90 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
14ba0 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
14bb0 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  renced..**.** Re
14bc0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
14bd0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
14be0 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
14bf0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75  roed..**.** Actu
14c00 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69  ally, at the poi
14c10 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nt this routine 
14c20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f  is called, it wo
14c30 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72  uld be.** an err
14c40 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66  or to have a ref
14c50 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42  erenced page.  B
14c60 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  ut rather than d
14c70 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61  elete.** that pa
14c80 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65  ge and guarantee
14c90 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65   a subsequent se
14ca0 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73  gfault, it seems
14cb0 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65   better.** to ze
14cc0 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74  ro it and hope t
14cd0 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74  hat we error out
14ce0 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74   sanely..*/.stat
14cf0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72  ic void pager_tr
14d00 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67  uncate_cache(Pag
14d10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
14d20 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
14d30 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
14d40 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
14d50 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
14d60 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
14d70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
14d80 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
14d90 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
14da0 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
14db0 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
14dc0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
14dd0 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
14de0 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
14df0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
14e00 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
14e10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14e20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
14e30 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
14e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
14e50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
14e60 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  l;.      IOTRACE
14e70 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
14e80 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
14e90 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
14ea0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
14eb0 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
14ec0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c  ount);.      unl
14ed0 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
14ee0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
14ef0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
14f00 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20  3_free(pPg);.   
14f10 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
14f20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
14f30 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
14f40 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
14f50 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
14f60 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
14f70 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
14f80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
14f90 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
14fa0 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75  eat until the bu
14fb0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
14fc0 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
14fd0 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
14fe0 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
14ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15000 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
15010 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
15020 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
15030 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
15040 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15050 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
15060 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
15070 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
15080 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
15090 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
150a0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
150b0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
150c0 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
150d0 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
150e0 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
150f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
15100 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
15110 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
15120 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
15130 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
15140 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
15150 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
15160 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
15170 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
15180 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
15190 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
151a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
151b0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
151c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c  ager->dbSize<0 |
151d0 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66  | MEMDB );..  if
151e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
151f0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
15200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15210 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
15220 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
15230 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
15240 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
15250 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
15260 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
15270 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
15280 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
15290 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
152a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
152b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
152d0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
152e0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
152f0 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
15300 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
15310 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
15330 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
15340 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
15350 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
15360 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15370 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50  3PagerTruncate(P
15380 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
15390 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
153a0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
153b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
153c0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45  GER_SHARED || ME
153d0 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  MDB );.  sqlite3
153e0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
153f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
15400 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
15410 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
15420 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72  ->errCode;.    r
15430 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
15440 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
15450 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
15460 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
15470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15480 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
15490 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
154a0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
154b0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
154c0 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
154d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
154e0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45  OK;.  }.  pagerE
154f0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
15500 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
15510 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
15520 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
15530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15540 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15550 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
15560 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
15570 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15580 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
15590 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61  ncating. */.  pa
155a0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
155b0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
155c0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
155d0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
155e0 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  CK);.  pagerLeav
155f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
15600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15610 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
15620 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
15630 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
15640 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65  er, nPage);.  re
15650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15660 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
15670 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
15680 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
15690 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
156a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
156b0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
156c0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
156d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
156e0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
156f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
15700 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
15710 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
15720 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
15730 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
15740 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
15750 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
15760 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
15770 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
15780 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
15790 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
157a0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
157b0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
157c0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
157d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
157e0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
157f0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
15800 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
15810 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
15820 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
15830 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
15840 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
15850 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
15860 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
15870 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
15880 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
15890 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
158a0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
158b0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
158c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
158d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
158e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
158f0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15900 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d  EMENT.  if( !MEM
15910 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  DB ){.    sqlite
15920 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
15930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
15940 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15950 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
15960 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15970 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
15980 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15990 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
159a0 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e  Pager->pPrev->pN
159b0 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ext = pPager->pN
159c0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
159d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
159e0 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d  erList = pPager-
159f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
15a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e    if( pPager->pN
15a10 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
15a20 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ger->pNext->pPre
15a30 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65  v = pPager->pPre
15a40 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  v;.    }.    sql
15a50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15a60 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e  (mutex);.  }.#en
15a70 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  dif..  disable_s
15a80 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
15a90 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rs();.  pPager->
15aa0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
15ab0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
15ac0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
15ad0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
15ae0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
15af0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
15b00 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
15b10 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15b20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
15b30 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
15b40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
15b50 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
15b60 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
15b70 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
15b80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
15b90 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
15ba0 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
15bb0 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
15bc0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15bd0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
15be0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
15bf0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
15c00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
15c10 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
15c20 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
15c30 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
15c40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
15c50 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
15c60 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
15c70 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
15c80 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
15c90 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
15ca0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
15cb0 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
15cc0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
15cd0 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
15ce0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
15cf0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
15d00 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
15d10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15d20 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
15d30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
15d40 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
15d50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
15d60 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
15d70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15d80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
15d90 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
15da0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
15db0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
15dc0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
15dd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
15de0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
15df0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
15e00 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
15e10 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
15e20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15e30 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
15e40 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
15e50 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
15e60 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
15e70 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
15e80 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
15e90 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
15ea0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
15eb0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
15ec0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
15ed0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
15ee0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
15ef0 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
15f00 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
15f10 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
15f20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
15f30 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
15f40 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
15f50 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
15f60 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
15f70 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
15f80 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
15f90 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
15fa0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
15fb0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
15fc0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
15fd0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
15fe0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
15ff0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
16000 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
16010 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
16020 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
16030 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76      lruListRemov
16040 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  e(pPg);.    pPg-
16050 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
16060 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
16070 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  ++;.  REFINFO(pP
16080 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  g);.}.#ifdef SQL
16090 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74  ITE_DEBUG.  stat
160a0 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66  ic void page_ref
160b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
160c0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
160d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67  =0 ){.      _pag
160e0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  e_ref(pPg);.    
160f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
16100 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
16110 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
16120 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20    }.  }.#else.# 
16130 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28  define page_ref(
16140 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d  P)   ((P)->nRef=
16150 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a  =0?_page_ref(P):
16160 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b  (void)(P)->nRef+
16170 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  +).#endif../*.**
16180 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
16190 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
161a0 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
161b0 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
161c0 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
161d0 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
161e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
161f0 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
16200 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72 45 6e  *pPg){.  pagerEn
16210 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29  ter(pPg->pPager)
16220 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
16230 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
16240 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
16250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
16270 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
16280 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
16290 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
162a0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
162b0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
162c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
162d0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
162e0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
162f0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
16300 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
16310 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
16320 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16330 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
16340 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
16350 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
16360 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
16370 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
16380 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
16390 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
163a0 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
163b0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
163c0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
163d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
163e0 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
163f0 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
16400 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
16410 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
16420 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
16430 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
16440 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
16450 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
16460 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
16470 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
16480 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
16490 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
164a0 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
164b0 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
164c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
164d0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
164e0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
164f0 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
16500 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
16510 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
16520 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
16530 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
16540 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
16550 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
16560 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
16570 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
16580 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
16590 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
165a0 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
165b0 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
165c0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
165d0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
165e0 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e  er failure, so n
165f0 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
16600 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41  *.** If the IOCA
16610 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61  P_SEQUENTIAL fla
16620 67 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65  g is set for the
16630 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
16640 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68  a on which.** th
16650 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
16660 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e  ored, then OsSyn
16670 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
16680 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  led on the journ
16690 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74  al.** file. In t
166a0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61  his case all tha
166b0 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
166c0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e   to update the n
166d0 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20  Rec field in.** 
166e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
166f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
16700 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
16710 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
16720 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
16730 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
16740 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
16750 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
16760 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
16770 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
16780 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16790 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53  ITE_OK;...  /* S
167a0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
167b0 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
167c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
167d0 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
167e0 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
167f0 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
16800 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
16810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
16820 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
16830 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
16840 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
16850 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
16860 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
16870 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
16880 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
16890 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
168a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
168b0 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
168c0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
168d0 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
168e0 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
168f0 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
16900 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
16910 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
16920 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
16930 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
16940 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
16950 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
16960 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
16970 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
16980 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
16990 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
169a0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
169b0 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
169c0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
169d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
169e0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
169f0 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
16a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16a10 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
16a20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
16a30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16a40 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
16a50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16a60 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
16a70 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
16a80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16a90 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
16aa0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
16ab0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
16ac0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
16ad0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
16ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16af0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
16b00 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
16b10 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
16b20 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
16b30 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
16b40 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
16b50 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
16b60 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
16b70 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
16b80 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
16b90 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
16ba0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
16bb0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
16bc0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16bd0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
16be0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
16bf0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
16c00 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
16c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
16c20 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
16c30 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
16c40 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
16c50 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
16c60 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
16c70 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
16c80 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
16c90 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
16ca0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
16cb0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
16cc0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
16cd0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
16ce0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
16cf0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
16d00 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
16d10 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
16d20 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
16d30 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
16d40 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
16d50 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
16d60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
16d70 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
16d80 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
16d90 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
16da0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
16db0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
16dc0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
16dd0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
16de0 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
16df0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
16e00 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
16e10 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
16e20 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
16e30 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
16e40 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
16e50 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
16e60 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16e70 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
16e80 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
16e90 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16ea0 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
16eb0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
16ec0 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
16ed0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
16ee0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
16ef0 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
16f00 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
16f10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16f20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16f30 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
16f40 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
16f50 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
16f60 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
16f70 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
16f80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16f90 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
16fa0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
16fb0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
16fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16fd0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
16fe0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
16ff0 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
17000 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17010 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
17020 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
17030 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
17040 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
17050 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17060 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
17070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
17080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
17090 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
170a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
170b0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
170c0 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
170d0 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
170e0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
170f0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
17100 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
17110 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
17120 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
17130 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
17140 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65   }.    lruListSe
17150 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
17160 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  ger);.  }..#ifnd
17170 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
17180 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
17190 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
171a0 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
171b0 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
171c0 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
171d0 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
171e0 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
171f0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
17200 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
17210 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
17220 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
17230 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
17240 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
17250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17260 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
17270 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
17280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75  ert( pPager->lru
17290 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  .pFirstSynced==p
172a0 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
172b0 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
172c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
172d0 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
172e0 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
172f0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
17300 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
17310 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
17320 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
17330 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
17340 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
17350 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
17360 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
17370 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
17380 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
17390 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
173a0 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
173b0 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
173c0 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
173d0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
173e0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
173f0 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
17400 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
17410 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
17420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
17430 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
17440 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
17450 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
17460 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
17470 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
17480 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
17490 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
174a0 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
174b0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
174c0 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
174d0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
174e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
174f0 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
17500 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
17510 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
17520 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
17530 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
17540 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
17550 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
17560 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
17570 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
17580 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
17590 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
175a0 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
175b0 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35  _BUCKET_ALLOC 25
175c0 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
175d0 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a  BUCKET       25.
175e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
175f0 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
17600 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
17610 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64  cket = 0;.  #und
17620 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ef N_SORT_BUCKET
17630 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  .  #define N_SOR
17640 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73  T_BUCKET \.   (s
17650 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
17660 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74  ort_bucket?sqlit
17670 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
17680 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55  bucket:N_SORT_BU
17690 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64  CKET_ALLOC).#end
176a0 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  if.static PgHdr 
176b0 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50  *sort_pagelist(P
176c0 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67  gHdr *pIn){.  Pg
176d0 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55  Hdr *a[N_SORT_BU
176e0 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b  CKET_ALLOC], *p;
176f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
17700 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
17710 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
17720 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
17730 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
17740 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
17750 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
17760 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
17770 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
17780 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
17790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
177a0 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
177b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
177c0 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
177d0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
177e0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
177f0 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
17800 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17810 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
17820 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  -1 ){.      /* C
17830 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20  overage: To get 
17840 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64  here, there need
17850 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54   to be 2^(N_SORT
17860 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20  _BUCKET) .      
17870 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ** elements in t
17880 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54  he input list. T
17890 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c  his is possible,
178a0 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c   but impractical
178b0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69  ..      ** Testi
178c0 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  ng this line is 
178d0 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f  the point of glo
178e0 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20  bal variable.   
178f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61     ** sqlite3_pa
17900 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
17910 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
17920 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
17930 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
17940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
17950 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
17960 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
17970 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
17980 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
17990 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
179a0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
179b0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
179c0 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
179d0 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
179e0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
179f0 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
17a00 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
17a10 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
17a20 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
17a30 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
17a40 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
17a50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17a60 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
17a70 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
17a80 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
17a90 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74   PgHdr *p;.  int
17aa0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
17ab0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
17ac0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
17ad0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
17ae0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
17af0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
17b00 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
17b10 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
17b20 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
17b30 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
17b40 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
17b50 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
17b60 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
17b70 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
17b80 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
17b90 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
17ba0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
17bb0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
17bc0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
17bd0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
17be0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
17bf0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
17c00 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
17c10 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
17c20 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
17c30 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
17c40 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
17c50 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
17c60 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
17c70 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
17c80 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
17c90 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
17ca0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
17cb0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
17cc0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
17cd0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
17ce0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
17cf0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
17d00 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
17d10 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
17d20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
17d30 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
17d40 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17d50 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
17d60 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
17d70 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
17d80 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
17d90 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
17da0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
17db0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
17dc0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
17dd0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
17de0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
17df0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
17e00 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
17e10 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
17e20 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
17e30 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
17e40 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
17e50 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
17e60 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
17e70 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
17e80 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
17e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17ea0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17eb0 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
17ec0 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
17ed0 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  st);.  for(p=pLi
17ee0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
17ef0 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
17f00 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20   p->dirty );.   
17f10 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
17f20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73   }.  while( pLis
17f30 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
17f40 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
17f50 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
17f60 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
17f70 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
17f80 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
17f90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17fa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17fb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
17fc0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
17fd0 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
17fe0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
17ff0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
18000 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
18010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18020 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
18030 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
18040 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
18050 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
18060 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
18070 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
18080 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
18090 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
180a0 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
180b0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
180c0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
180d0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
180e0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
180f0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
18100 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
18110 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
18120 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
18130 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
18140 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
18150 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  e ){.      i64 o
18160 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e  ffset = (pList->
18170 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
18180 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
18190 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
181a0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
181b0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
181c0 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
181d0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50  gno, 6);.      P
181e0 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52  AGERTRACE4("STOR
181f0 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
18200 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
18220 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
18230 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67  pList->pgno, pag
18240 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
18250 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  t));.      IOTRA
18260 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
18270 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
18280 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  st->pgno));.    
18290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
182a0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
182b0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
182c0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
182d0 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
182e0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
182f0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
18300 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
18310 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
18320 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
18330 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  List->pgno==1 ){
18340 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
18350 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
18360 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
18370 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
18380 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
183a0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
183b0 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
183c0 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
183d0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
183e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
183f0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
18400 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
18410 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
18420 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
18430 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
18440 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
18450 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
18460 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
18470 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
18480 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
18490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
184a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c  OK;.}../*.** Col
184b0 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79  lect every dirty
184c0 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72   page into a dir
184d0 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  ty list and.** r
184e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
184f0 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
18500 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70  hat list.  All p
18510 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c  ages are.** coll
18520 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  ected even if th
18530 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  ey are still in 
18540 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  use..*/.static P
18550 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f  gHdr *pager_get_
18560 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
18570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18580 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
18590 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pDirty;.}../*.*
185a0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
185b0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
185c0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
185d0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
185e0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
185f0 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
18600 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
18610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
18620 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18640 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
18650 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
18660 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
18670 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
18680 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
18690 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
186a0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
186b0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
186c0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
186d0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
186e0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
186f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18700 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
18710 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
18720 56 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67  Vfs;.  if( !pPag
18730 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
18740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
18750 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73   !sqlite3OsAcces
18760 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
18770 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18780 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
18790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
187a0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
187b0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
187c0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
187d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
187e0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
187f0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18800 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  nt(pPager)==0 ){
18810 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
18820 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
18830 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
18840 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
18860 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
18870 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
18880 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
18890 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
188a0 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
188b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
188c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
188d0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
188e0 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
188f0 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
18900 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
18910 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
18920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18930 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
18940 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
18950 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
18960 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
18970 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
18980 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45  0;..  assert(!ME
18990 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  MDB);..  /* Find
189a0 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
189b0 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
189c0 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
189d0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
189e0 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
189f0 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
18a00 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
18a10 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
18a20 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  u.pFirstSynced;.
18a30 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
18a40 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
18a50 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
18a60 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
18a70 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
18a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
18a90 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
18aa0 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
18ab0 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
18ac0 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
18ad0 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
18ae0 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
18af0 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
18b00 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
18b10 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
18b20 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
18b30 6c 72 75 2e 70 46 69 72 73 74 20 26 26 20 73 79  lru.pFirst && sy
18b40 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b  ncOk && !MEMDB){
18b50 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73  .    int iDc = s
18b60 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
18b70 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
18b80 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69  ager->fd);.    i
18b90 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
18ba0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
18bb0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
18bc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18be0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
18bf0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
18c00 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
18c10 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  D) ){.      /* I
18c20 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
18c30 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
18c40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
18c50 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
18c60 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
18c70 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
18c80 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
18c90 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
18ca0 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
18cb0 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
18cc0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
18cd0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
18ce0 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
18cf0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
18d00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18d10 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
18d20 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
18d30 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
18d40 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
18d50 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
18d60 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
18d70 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
18d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18d90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
18da0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18db0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
18dc0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
18dd0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
18de0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
18df0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
18e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18e10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
18e20 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
18e30 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20  r->lru.pFirst;. 
18e40 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
18e50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18e60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
18e70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
18e80 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  f==0 );..  /* Wr
18e90 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
18ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18eb0 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
18ec0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
18ed0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69  ->dirty ){.    i
18ee0 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
18ef0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
18f00 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43  ==0 );.    makeC
18f10 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
18f20 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
18f30 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
18f40 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
18f50 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
18f60 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t( pPg );.    pP
18f70 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
18f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18fa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18fb0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  }.  assert( pPg-
18fc0 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
18fd0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
18fe0 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
18ff0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
19000 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
19010 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67  n.  ** set the g
19020 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
19030 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
19040 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
19050 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
19060 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  ontRollback() op
19070 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
19080 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
19090 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
190a0 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
190b0 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
190c0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
190d0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
190e0 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
190f0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
19100 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
19110 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
19120 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
19130 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
19140 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
19150 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
19160 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
19170 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
19180 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
19190 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
191a0 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
191b0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
191c0 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
191d0 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
191e0 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
191f0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
19200 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
19210 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
19220 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
19230 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
19240 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
19250 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
19260 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
19270 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pPg);.  assert( 
19280 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a  pPg->pgno==0 );.
19290 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
192a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
192b0 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
192c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
192d0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a  RY_MANAGEMENT./*
192e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
192f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66  n is called to f
19300 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20  ree superfluous 
19310 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
19320 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  cated memory.** 
19330 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65  held by the page
19340 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79  r system. Memory
19350 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53   in use by any S
19360 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f  QLite pager allo
19370 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  cated.** by the 
19380 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d  current thread m
19390 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72  ay be sqlite3_fr
193a0 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52  ee()ed..**.** nR
193b0 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  eq is the number
193c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
193d0 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e  ory required. On
193e0 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73  ce this much has
193f0 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65  .** been release
19400 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  d, the function 
19410 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74  returns. The ret
19420 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
19430 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
19440 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
19450 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
19460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19470 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28  erReleaseMemory(
19480 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74  int nReq){.  int
19490 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 20   nReleased = 0; 
194a0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
194b0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
194c0 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ased so far */. 
194d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
194e0 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a 20  mutex;       /* 
194f0 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a  The MEM2 mutex *
19500 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  /.  Pager *pPage
19510 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
19520 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19530 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20 20  ver pagers */.  
19540 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19550 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72  OK;..  /* Acquir
19560 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e  e the memory-man
19570 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20  agement mutex.  
19580 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c  */.  mutex = sql
19590 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
195a0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
195b0 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71  ATIC_MEM2);.  sq
195c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
195d0 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  r(mutex);..  /* 
195e0 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62  Signal all datab
195f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
19600 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61  that memory mana
19610 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a  gement wants.  *
19620 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73  * to have access
19630 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a   to the pagers..
19640 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65    */.  for(pPage
19650 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  r=sqlite3PagerLi
19660 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67  st; pPager; pPag
19670 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
19680 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ){.     pPager->
19690 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20  iInUseMM = 1;.  
196a0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
196b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52  SQLITE_OK && (nR
196c0 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
196d0 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50  d<nReq) ){.    P
196e0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50  gHdr *pPg;.    P
196f0 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b  gHdr *pRecycled;
19700 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  . .    /* Try to
19710 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   find a page to 
19720 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65  recycle that doe
19730 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  s not require a 
19740 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a  sync(). If.    *
19750 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f  * this is not po
19760 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65  ssible, find one
19770 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69   that does requi
19780 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20  re a sync()..   
19790 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
197a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
197b0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
197c0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
197d0 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70  TIC_LRU));.    p
197e0 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50  Pg = sqlite3LruP
197f0 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
19800 6e 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28  nced;.    while(
19810 20 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65   pPg && (pPg->ne
19820 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70  edSync || pPg->p
19830 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29  Pager->iInUseDB)
19840 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
19850 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74  pPg->gfree.pNext
19860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19870 21 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50  !pPg ){.      pP
19880 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
19890 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20  geList.pFirst;. 
198a0 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20       while( pPg 
198b0 26 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  && pPg->pPager->
198c0 69 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20  iInUseDB ){.    
198d0 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67      pPg = pPg->g
198e0 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20  free.pNext;.    
198f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
19900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
19910 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
19920 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
19930 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
19940 0a 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29  ..    if( !pPg )
19950 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61   break;..    pPa
19960 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
19970 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70  r;.    assert(!p
19980 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20  Pg->needSync || 
19990 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75  pPg==pPager->lru
199a0 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73  .pFirst);.    as
199b0 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79  sert(pPg->needSy
199c0 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65  nc || pPg==pPage
199d0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
199e0 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 72 63 20  ced);.  .    rc 
199f0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
19a00 70 50 61 67 65 72 2c 20 31 2c 20 26 70 52 65 63  pPager, 1, &pRec
19a10 79 63 6c 65 64 29 3b 0a 20 20 20 20 61 73 73 65  ycled);.    asse
19a20 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50  rt(pRecycled==pP
19a30 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  g || rc!=SQLITE_
19a40 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  OK);.    if( rc=
19a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19a60 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
19a70 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
19a80 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
19a90 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
19aa0 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d  en .      ** rem
19ab0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
19ac0 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
19ad0 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
19ae0 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
19af0 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64  ** (pFirstSynced
19b00 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69  ). It is still i
19b10 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20  n the all pages 
19b20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20  (pAll) list. .  
19b30 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
19b40 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
19b50 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
19b60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19b70 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68  * Todo: Check th
19b80 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69  e Pager.pStmt li
19b90 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
19ba0 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a  this is Ok. It .
19bb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
19bc0 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20  y is though..   
19bd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64     */.      PgHd
19be0 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61  r *pTmp;.      a
19bf0 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
19c00 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61      if( pPg==pPa
19c10 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
19c20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
19c30 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
19c40 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ll;.      }else{
19c50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54  .        for( pT
19c60 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  mp=pPager->pAll;
19c70 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21   pTmp->pNextAll!
19c80 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  =pPg; pTmp=pTmp-
19c90 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20  >pNextAll ){}.  
19ca0 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
19cb0 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
19cc0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tAll;.      }.  
19cd0 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
19ce0 20 28 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a   (.          siz
19cf0 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
19d00 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
19d10 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
19d20 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
19d30 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
19d40 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
19d50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20  gHistory) .     
19d60 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43   );.      IOTRAC
19d70 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
19d80 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70   *\n", pPager, p
19d90 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
19da0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
19db0 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
19dc0 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
19dd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
19de0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19df0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
19e00 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
19e10 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
19e20 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a  tabase file or .
19e30 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
19e40 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
19e50 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
19e60 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
19e70 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
19e80 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
19e90 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
19ea0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
19eb0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
19ec0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  ..      ** The e
19ed0 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
19ee0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
19ef0 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
19f00 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
19f10 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
19f20 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
19f30 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
19f40 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
19f50 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ured..      */. 
19f60 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20       assert(.   
19f70 20 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29         (rc&0xff)
19f80 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
19f90 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  |.          rc==
19fa0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
19fb0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
19fc0 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29  ITE_BUSY.      )
19fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19fe0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19ff0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1a000 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
1a010 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1a020 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a030 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79  Clear the memory
1a040 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67   management flag
1a050 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  s and release th
1a060 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66  e mutex.  */.  f
1a070 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65  or(pPager=sqlite
1a080 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67  3PagerList; pPag
1a090 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65  er; pPager=pPage
1a0a0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1a0b0 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d  pPager->iInUseMM
1a0c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1a0d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a0e0 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  mutex);..  /* Re
1a0f0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1a100 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65  of bytes release
1a110 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  d.  */.  return 
1a120 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
1a130 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1a140 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1a150 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
1a160 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1a170 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
1a180 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1a190 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1a1a0 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
1a1b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a1c0 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
1a1d0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
1a1e0 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a  ;.  i64 offset;.
1a1f0 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
1a200 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  =0 );.  assert(p
1a210 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1a220 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
1a230 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
1a240 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1a250 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
1a260 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
1a270 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
1a280 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1a290 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1a2a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
1a2b0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1a2c0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
1a2d0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1a2e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1a2f0 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
1a300 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1a310 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1a320 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1a330 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1a340 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1a350 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1a360 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
1a370 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1a380 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1a390 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
1a3a0 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  u8*)PGHDR_TO_DAT
1a3b0 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20  A(pPg))[24],.   
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1a3f0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1a400 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
1a410 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
1a420 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1a430 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
1a440 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46    PAGERTRACE4("F
1a450 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1a460 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1a480 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1a490 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
1a4a0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
1a4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a4c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a4d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1a4e0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
1a4f0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
1a500 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
1a510 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
1a520 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
1a530 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
1a540 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
1a550 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
1a560 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1a570 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
1a580 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
1a590 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
1a5a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1a5b0 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
1a5c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1a5d0 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
1a5e0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
1a5f0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
1a600 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
1a610 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
1a620 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
1a630 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1a640 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1a650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a670 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
1a680 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1a690 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1a6a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1a6b0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1a6c0 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  s;.    if( !MEMD
1a6d0 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
1a6e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
1a6f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1a700 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
1a710 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
1a720 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1a730 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
1a740 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
1a750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a770 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1a780 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1a790 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
1a7a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a7b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
1a7c0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
1a7d0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
1a7e0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
1a7f0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
1a800 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
1a810 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
1a820 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1a830 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
1a840 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
1a850 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
1a860 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20   deleted..      
1a870 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  */.      if( has
1a880 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
1a890 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
1a8a0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
1a8b0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1a8c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
1a8d0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
1a8e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
1a8f0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
1a900 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1a910 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
1a920 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
1a930 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
1a940 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
1a950 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
1a960 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
1a970 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
1a980 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
1a990 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
1a9a0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
1a9b0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
1a9c0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1a9d0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
1a9e0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
1a9f0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
1aa00 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
1aa10 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
1aa20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1aa30 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
1aa40 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
1aa50 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
1aa60 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
1aa70 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
1aa80 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
1aa90 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
1aaa0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
1aab0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
1aac0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
1aad0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1aae0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1aaf0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1ab00 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
1ab10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1ab20 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
1ab30 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1ab40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ab60 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1ab70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1ab80 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1ab90 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1aba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1abb0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1abc0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1abd0 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a  VE;. .        /*
1abe0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
1abf0 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
1ac00 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
1ac10 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
1ac20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
1ac30 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
1ac40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
1ac50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1ac60 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
1ac70 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
1ac80 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
1ac90 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
1aca0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
1acb0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
1acc0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
1acd0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1ace0 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20  e holds.        
1acf0 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
1ad00 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
1ad10 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
1ad20 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
1ad30 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
1ad40 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
1ad50 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
1ad60 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  e time..        
1ad70 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  **.        ** Op
1ad80 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ad90 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
1ada0 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
1adb0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
1adc0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
1add0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
1ade0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1adf0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
1ae00 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
1ae10 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
1ae20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
1ae30 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
1ae40 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
1ae50 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
1ae60 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
1ae70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
1ae80 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
1ae90 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
1aea0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
1aeb0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
1aec0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1aed0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1aee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
1aef0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1af00 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1af10 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
1af20 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
1af30 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
1af40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1af50 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
1af60 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1af70 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
1af80 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
1af90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1afa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1afb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
1afc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1afd0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1afe0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1aff0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 26 66 6f 75  >jfd, flags,&fou
1b000 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
1b010 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1b020 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
1b030 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
1b040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6f            if( fo
1b050 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1b060 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
1b070 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b080 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1b090 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
1b0a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
1b0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b0d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b0e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1b0f0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1b100 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
1b110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1b120 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
1b130 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b140 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
1b150 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b160 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1b170 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1b180 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1b190 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1b1a0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1b1b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b1c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1b1d0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c  . .        /* Pl
1b1e0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
1b1f0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
1b200 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
1b210 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20  e write.        
1b220 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
1b230 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1b240 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
1b250 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b260 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1b270 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
1b280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b290 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1b2a0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1b2b0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1b2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b2d0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1b2e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1b2f0 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
1b300 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
1b310 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1b320 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
1b330 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
1b340 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
1b350 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b360 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1b370 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
1b380 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
1b390 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
1b3a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1b3b0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
1b3c0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
1b3d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1b3e0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
1b3f0 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ous.        ** r
1b400 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1b410 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
1b420 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1b430 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
1b440 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
1b450 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
1b460 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
1b470 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
1b480 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e         ** cache.
1b490 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b4a0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
1b4b0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
1b4c0 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
1b4d0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
1b4e0 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ning.        ** 
1b4f0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
1b500 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
1b510 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
1b520 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
1b530 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62         ** a 32-b
1b540 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
1b550 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1b560 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
1b570 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1b580 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
1b590 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
1b5a0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
1b5b0 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ge when.        
1b5c0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
1b5d0 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   use..        **
1b5e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65   .        ** The
1b5f0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1b600 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1b610 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1b620 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1b630 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1b640 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1b650 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1b660 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1b670 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1b680 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
1b690 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cted..        */
1b6a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62  .        char db
1b6b0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
1b6c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1b6d0 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  rs)];.        sq
1b6e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b6f0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  unt(pPager);..  
1b700 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1b710 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1b720 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50         return pP
1b730 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1b740 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1b750 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1b760 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1b770 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1b780 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1b790 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1b7a0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1b7b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b7c0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1b7d0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1b7e0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1b7f0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1b800 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b850 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1b860 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1b870 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1b880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b890 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1b8a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1b8b0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1b8c0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1b8d0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1b8e0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1b8f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b900 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b920 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1b930 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1b940 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1b950 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1b960 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1b970 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1b980 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1b990 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1b9a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1b9b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b9c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1b9d0 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1b9e0 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1b9f0 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1ba00 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1ba10 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1ba20 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1ba30 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1ba40 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1ba50 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1ba60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ba70 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1ba80 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1ba90 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1baa0 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1bab0 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1bac0 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1bad0 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1bae0 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1baf0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1bb00 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1bb10 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1bb20 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1bb30 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1bb40 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1bb50 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1bb60 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1bb70 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1bb80 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1bb90 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1bba0 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1bbb0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1bbc0 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1bbd0 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1bbe0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1bbf0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1bc00 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1bc10 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1bc20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1bc30 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1bc40 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1bc50 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1bc60 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1bc70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1bc80 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1bc90 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1bca0 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1bcb0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1bcc0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1bcd0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1bce0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1bcf0 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1bd00 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1bd10 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1bd20 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1bd30 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1bd40 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1bd50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1bd60 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1bd70 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1bd80 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1bd90 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1bda0 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1bdb0 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1bdc0 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1bdd0 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1bde0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1bdf0 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1be00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1be10 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1be20 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1be30 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1be40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1be50 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1be60 70 50 67 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  pPg;..  /* Creat
1be70 65 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66  e a new PgHdr if
1be80 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72   any of the four
1be90 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69   conditions defi
1bea0 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  ned .  ** above 
1beb0 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66  are met: */.  if
1bec0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
1bed0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20  pPager->mxPage. 
1bee0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75    || pPager->lru
1bef0 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  .pFirst==0 .   |
1bf00 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
1bf10 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1bf20 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
1bf30 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
1bf40 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
1bf50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
1bf60 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
1bf70 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
1bf80 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
1bf90 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
1bfa0 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
1bfb0 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
1bfc0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
1bfd0 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
1bfe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1bff0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c000 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
1c010 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1c020 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1c030 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
1c040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 67  pPager);.    pPg
1c050 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1c060 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  c( sizeof(*pPg) 
1c070 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1c080 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1c0a0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1c0b0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
1c0e0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
1c0f0 72 79 29 20 29 3b 0a 20 20 20 20 70 61 67 65 72  ry) );.    pager
1c100 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1c110 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
1c120 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c130 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1c140 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1c150 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1c160 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
1c170 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
1c180 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1c190 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
1c1a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1c1b0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
1c1c0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
1c1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
1c1e0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1c1f0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1c200 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1c210 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
1c220 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
1c230 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
1c240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1c250 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
1c260 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
1c270 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
1c280 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1c290 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1c2a0 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
1c2b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c2c0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
1c2d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1c2e0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
1c2f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1c310 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1c320 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1c330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c340 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
1c350 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
1c360 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
1c370 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
1c380 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
1c390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c3a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1c3b0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
1c3c0 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
1c3d0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
1c3e0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
1c3f0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1c400 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
1c410 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
1c420 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
1c430 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
1c440 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
1c450 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1c460 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
1c470 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
1c480 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
1c490 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
1c4a0 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
1c4b0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
1c4c0 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
1c4d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1c4e0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1c4f0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
1c500 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
1c510 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
1c520 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1c530 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
1c540 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
1c570 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1c580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c5a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c5b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c5c0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1c5d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
1c5e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
1c5f0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
1c600 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
1c610 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
1c620 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
1c630 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
1c640 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
1c650 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
1c660 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1c670 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1c680 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
1c690 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
1c6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1c6b0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
1c6c0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1c6d0 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
1c6e0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
1c6f0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
1c700 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
1c710 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
1c720 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
1c730 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
1c740 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
1c750 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
1c760 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
1c770 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
1c780 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
1c790 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
1c7a0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
1c7b0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
1c7c0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
1c7d0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
1c7e0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
1c7f0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
1c800 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
1c810 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1c820 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
1c830 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1c840 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1c850 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
1c860 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
1c870 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
1c880 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
1c890 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
1c8a0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1c8b0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
1c8c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1c8d0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
1c8e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
1c8f0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
1c900 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
1c910 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
1c920 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
1c930 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
1c940 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
1c950 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1c960 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
1c970 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
1c980 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
1c990 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
1c9a0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
1c9b0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
1c9c0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
1c9d0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
1c9e0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
1c9f0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
1ca00 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1ca10 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
1ca20 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
1ca30 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1ca40 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1ca50 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1ca60 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1ca70 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1ca80 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1ca90 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1caa0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1cab0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1cac0 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1cad0 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1cae0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1caf0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1cb00 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1cb10 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1cb20 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1cb30 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1cb40 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1cb50 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1cb60 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1cb70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1cb80 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1cb90 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1cba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1cbb0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1cbc0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1cbd0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1cbe0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1cbf0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1cc00 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1cc10 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1cc20 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
1cc30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
1cc40 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1cc50 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1cc60 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1cc70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1cc80 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1cc90 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1cca0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1ccb0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1ccc0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1ccd0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1cce0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1ccf0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1cd00 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1cd10 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1cd20 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1cd30 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1cd40 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1cd50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1cd60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cd70 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1cd80 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1cd90 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1cda0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1cdb0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1cdc0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1cdd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1cde0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1cdf0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1ce00 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1ce10 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1ce20 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1ce30 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1ce40 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1ce50 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1ce60 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1ce70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ce80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1ce90 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1cea0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1ceb0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1cec0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1ced0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1cee0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1cef0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1cf00 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1cf10 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1cf20 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1cf30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1cf40 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
1cf50 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1cf60 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
1cf70 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
1cf80 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
1cf90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cfa0 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
1cfb0 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
1cfc0 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
1cfd0 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
1cfe0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
1cff0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
1d000 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
1d010 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1d020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1d030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1d040 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1d050 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1d060 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
1d070 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1d080 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1d090 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
1d0a0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1d0b0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
1d0c0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1d0d0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
1d0e0 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
1d0f0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d100 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
1d110 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
1d120 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
1d130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d160 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
1d170 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
1d180 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
1d190 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
1d1a0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
1d1b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1d1c0 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
1d1d0 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1d1e0 53 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20  Size ){.#if 0.  
1d1f0 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b      sqlite3Check
1d200 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61  Memory(pPager->a
1d210 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f  InJournal, pgno/
1d220 38 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  8);.#endif.     
1d230 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d240 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1d250 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1d260 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
1d270 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
1d280 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
1d290 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
1d2a0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1d2b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d2c0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1d2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d2e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1d2f0 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c     }..    makeCl
1d300 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
1d310 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
1d320 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
1d330 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
1d340 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
1d350 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
1d360 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1d370 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
1d380 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
1d390 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
1d3a0 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73    }.    nMax = s
1d3b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1d3c0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1d3d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d3e0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  rCode ){.      s
1d3f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d400 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20  (pPg);.      rc 
1d410 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1d420 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
1d430 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
1d440 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
1d450 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
1d460 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
1d470 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d480 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
1d490 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
1d4a0 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
1d4b0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1d4c0 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
1d4d0 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
1d4e0 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
1d4f0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1d500 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
1d510 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1d520 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1d530 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1d540 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1d550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d560 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
1d570 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1d580 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1d590 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
1d5a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
1d5b0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
1d5c0 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
1d5d0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1d5e0 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
1d5f0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
1d600 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1d610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d620 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d630 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
1d640 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1d650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1d660 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1d670 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1d680 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
1d690 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
1d6a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d6b0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1d6c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d6d0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
1d6e0 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1d6f0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
1d700 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
1d710 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
1d720 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
1d730 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
1d740 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
1d750 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
1d760 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1d770 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1d780 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
1d790 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
1d7a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
1d7b0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
1d7c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
1d7d0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
1d7e0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
1d7f0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
1d800 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1d810 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1d820 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d830 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1d840 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1d850 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1d860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1d870 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1d880 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
1d890 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
1d8a0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1d8b0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1d8c0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
1d8d0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
1d8e0 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
1d8f0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
1d900 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1d910 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
1d920 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1d950 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
1d960 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
1d970 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
1d980 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
1d990 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
1d9a0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1d9b0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
1d9c0 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
1d9d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1d9e0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
1d9f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
1da00 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
1da10 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
1da20 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
1da30 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1da40 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
1da50 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
1da60 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
1da70 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
1da80 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
1da90 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1daa0 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
1dab0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1dac0 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
1dad0 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
1dae0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
1daf0 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  nt);.  pagerLeav
1db00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1db10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1db20 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1db30 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
1db40 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
1db50 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
1db60 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
1db70 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
1db80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1db90 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
1dba0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
1dbb0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
1dbc0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1dbd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1dbe0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
1dbf0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1dc00 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
1dc10 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1dc20 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
1dc30 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
1dc40 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
1dc50 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
1dc60 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1dc70 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
1dc80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1dc90 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
1dca0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1dcb0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
1dcc0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
1dcd0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
1dce0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
1dcf0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
1dd00 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
1dd10 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1dd20 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1dd30 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1dd40 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
1dd50 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1dd60 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
1dd70 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
1dd80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1dd90 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1dda0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1ddb0 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65  r->pAll || pPage
1ddc0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1ddd0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
1dde0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1ddf0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1de00 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1de10 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
1de20 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  hing */.  }else 
1de30 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72  if( (pPg = pager
1de40 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1de50 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  pgno))!=0 ){.   
1de60 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
1de70 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
1de80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1de90 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
1dea0 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
1deb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
1dec0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1ded0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
1dee0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
1def0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
1df00 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
1df10 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
1df20 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
1df30 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
1df40 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
1df50 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
1df60 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
1df70 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
1df80 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
1df90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1dfa0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
1dfb0 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
1dfc0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1dfd0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
1dfe0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1dff0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1e000 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
1e010 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
1e020 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
1e030 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45  NFO(pPg);..  CHE
1e040 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1e050 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
1e060 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1e070 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
1e080 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
1e090 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
1e0a0 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
1e0b0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1e0c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1e0d0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
1e0e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e0f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 20  Pg->pPager;..   
1e100 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29   lruListAdd(pPg)
1e110 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1e120 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
1e130 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
1e140 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20  Destructor(pPg, 
1e150 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e160 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
1e170 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
1e180 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
1e190 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
1e1a0 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
1e1b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1e1c0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1e1d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
1e1e0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
1e1f0 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
1e200 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1e210 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70  ->nRef==0 && (!p
1e220 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1e230 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1e240 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b  journalOff>0) ){
1e250 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  .      pagerUnlo
1e260 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
1e270 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1e280 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1e290 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65  g->pPager);.  re
1e2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1e2c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
1e2d0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
1e2e0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
1e2f0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
1e300 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
1e310 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1e320 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
1e330 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e340 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
1e350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1e360 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
1e370 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1e380 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1e390 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
1e3a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1e3b0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1e3c0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
1e3d0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
1e3e0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
1e3f0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1e400 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1e410 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
1e420 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1e430 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  E|SQLITE_OPEN_EX
1e440 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
1e450 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20  PEN_CREATE);..  
1e460 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
1e470 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
1e480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e490 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1e4a0 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
1e4b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1e4c0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
1e4d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
1e4e0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1e4f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1e500 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1e510 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1e520 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1e530 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1e540 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
1e550 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1e560 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
1e570 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1e580 2b 20 31 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  + 1 );.  pagerEn
1e590 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
1e5a0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
1e5b0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
1e5c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1e5d0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
1e5e0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1e5f0 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  al;.  }..  if( p
1e600 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1e610 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
1e620 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
1e630 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
1e640 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1e650 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NAL);.  }else{. 
1e660 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
1e670 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1e680 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69 66 64  URNAL);.  }.#ifd
1e690 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e6a0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1e6b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
1e6c0 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 70  nalOpen(.      p
1e6d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1e6e0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
1e6f0 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
1e700 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
1e710 29 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ).  );.#else.  r
1e720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1e730 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1e740 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
1e750 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
1e760 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
1e770 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
1e780 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
1e790 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 70  >pMethods );.  p
1e7a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1e7b0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
1e7c0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1e7d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1e7e0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
1e7f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e810 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
1e820 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1e830 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
1e840 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
1e850 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61     }.    goto fa
1e860 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1e870 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
1e880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1e890 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
1e8a0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1e8b0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
1e8c0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
1e8d0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1e8e0 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
1e8f0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
1e900 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e910 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
1e920 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1e930 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1e940 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1e950 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
1e960 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1e970 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
1e980 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1e990 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
1e9a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e9b0 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
1e9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e9d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e9e0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
1e9f0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1ea00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1ea10 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1ea20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1ea30 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1ea40 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
1ea50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea60 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ea70 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1ea80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ea90 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
1eaa0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
1eab0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
1eac0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1ead0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1eae0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1eaf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1eb00 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1eb10 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1eb20 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1eb30 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1eb40 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1eb50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1eb60 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1eb70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1eb80 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1eb90 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1eba0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ebb0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1ebc0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1ebd0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1ebe0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1ebf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ec00 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1ec10 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1ec20 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1ec30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1ec40 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1ec50 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1ec60 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1ec70 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1ec80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1ec90 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1eca0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1ecb0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1ecc0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1ecd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1ece0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ecf0 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1ed00 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1ed10 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1ed20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ed30 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1ed40 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1ed50 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1ed60 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1ed70 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1ed80 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1ed90 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1eda0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1edb0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1edc0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1edd0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1ede0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1edf0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1ee00 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1ee10 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1ee20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1ee30 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1ee40 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1ee50 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1ee60 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1ee70 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1ee80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1ee90 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1eea0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1eeb0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1eec0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1eed0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1eee0 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1eef0 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1ef00 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1ef10 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1ef20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1ef30 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1ef40 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1ef50 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1ef60 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1ef70 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1ef80 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1ef90 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1efa0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1efb0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1efc0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1efd0 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1efe0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1eff0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1f000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f010 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1f020 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
1f030 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
1f040 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f050 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1f060 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
1f070 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1f080 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
1f090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1f0a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1f0b0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1f0c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1f0d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1f0e0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
1f0f0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1f100 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1f110 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
1f120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f130 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1f140 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
1f150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1f160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1f180 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
1f190 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
1f1a0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
1f1b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f1c0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1f1d0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1f1e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
1f1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f210 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1f220 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1f230 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f240 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1f250 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1f260 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
1f270 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1f280 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1f290 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1f2a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1f2b0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1f2c0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1f2d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
1f2e0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1f2f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1f300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f310 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1f320 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1f330 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f340 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1f350 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1f360 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1f370 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1f380 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
1f390 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1f3a0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1f3b0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1f3c0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1f3d0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1f3e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1f3f0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1f400 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1f410 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1f420 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1f430 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1f440 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
1f450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f460 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1f470 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f480 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
1f490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f4a0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1f4b0 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1f4c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1f4d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
1f4e0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1f4f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1f500 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1f510 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61  3MallocZero( pPa
1f520 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1f530 31 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  1 );.    pagerEn
1f540 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1f550 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
1f560 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
1f570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1f580 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
1f590 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
1f5a0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1f5b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
1f5c0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1f5d0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1f5e0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1f5f0 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
1f600 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
1f610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
1f620 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
1f630 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
1f640 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1f650 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f660 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
1f670 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
1f680 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
1f690 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
1f6a0 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
1f6b0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1f6c0 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
1f6d0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1f6e0 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
1f6f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1f700 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
1f710 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
1f720 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1f730 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
1f740 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1f750 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
1f760 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
1f770 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
1f780 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
1f790 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
1f7a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
1f7b0 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
1f7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1f7d0 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
1f7e0 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
1f7f0 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
1f800 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
1f810 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1f820 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
1f830 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
1f840 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
1f850 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
1f860 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1f870 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
1f880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f890 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
1f8a0 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
1f8b0 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
1f8c0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1f8d0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
1f8e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1f8f0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
1f900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f910 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
1f920 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
1f930 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
1f940 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
1f950 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1f960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f970 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
1f980 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
1f990 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
1f9a0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
1f9b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
1f9c0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
1f9d0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
1f9e0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
1f9f0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
1fa00 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
1fa10 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
1fa20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1fa30 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
1fa40 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
1fa50 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
1fa60 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
1fa70 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
1fa80 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1fa90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1faa0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
1fab0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
1fac0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
1fad0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1fae0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1faf0 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
1fb00 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
1fb10 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
1fb20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1fb30 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
1fb40 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
1fb50 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
1fb60 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
1fb70 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
1fb80 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
1fb90 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
1fba0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
1fbb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1fbc0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1fbd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
1fbe0 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
1fbf0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
1fc00 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
1fc10 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
1fc20 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
1fc30 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
1fc40 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
1fc50 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
1fc60 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
1fc70 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
1fc80 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
1fc90 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
1fca0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
1fcb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
1fcc0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
1fcd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1fce0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
1fcf0 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
1fd00 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
1fd10 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
1fd20 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
1fd30 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
1fd40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1fd50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1fd60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fd70 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
1fd80 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
1fd90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1fda0 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
1fdb0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1fdc0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1fdd0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1fde0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1fdf0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
1fe00 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1fe10 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
1fe20 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
1fe30 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
1fe40 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
1fe50 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
1fe60 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1fe70 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
1fe80 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
1fe90 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
1fea0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1feb0 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
1fec0 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
1fed0 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
1fee0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
1fef0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
1ff00 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
1ff10 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
1ff20 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
1ff30 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
1ff40 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
1ff50 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
1ff60 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
1ff70 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1ff80 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
1ff90 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
1ffa0 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
1ffb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
1ffc0 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
1ffd0 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
1ffe0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1fff0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
20000 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
20010 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20020 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
20030 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
20040 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
20050 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
20060 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
20070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
20080 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
20090 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
200a0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
200b0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
200c0 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
200d0 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
200e0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
200f0 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
20100 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20110 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
20120 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
20130 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
20140 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
20150 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
20160 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
20170 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
20180 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
20190 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
201a0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
201b0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
201c0 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
201d0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
201e0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
201f0 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
20200 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
20210 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
20220 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
20230 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
20240 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
20250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20260 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
20270 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
20280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20290 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
202a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
202b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
202c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
202d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
202e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
202f0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
20300 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
20310 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
20320 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
20330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20340 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
20350 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
20360 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
20370 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
20380 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20390 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
203a0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
203b0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
203c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
203d0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
203e0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
203f0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
20400 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20410 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
20420 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
20430 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
20440 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
20450 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
20460 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
20470 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
20480 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
20490 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
204a0 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
204b0 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
204c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
204d0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
204e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
204f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
20500 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69   szPg;.        i
20510 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
20520 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
20530 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
20540 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
20550 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
20560 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
20570 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
20580 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20590 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
205a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
205b0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
205c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
205d0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
205e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
205f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
20600 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20610 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
20620 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
20630 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
20640 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
20650 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
20660 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
20670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
20680 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
20690 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20   cksum, saved;. 
206a0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
206b0 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Data2, *pEnd;.. 
206c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
206d0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
206e0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
206f0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
20700 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
20710 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
20720 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
20730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
20740 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
20750 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
20760 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
20770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20780 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
20790 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
207a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
207b0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
207c0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
207d0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
207e0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
207f0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
20800 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
20810 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
20820 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
20830 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
20840 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
20850 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
20860 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
20870 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
20880 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
20890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
208a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
208b0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
208c0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
208d0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
208e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
208f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
20900 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
20910 32 2c 20 73 7a 50 67 2c 20 70 50 61 67 65 72 2d  2, szPg, pPager-
20920 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
20930 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
20940 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
20950 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
20960 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20980 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20990 66 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20 20 20  f, szPg));.     
209a0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
209b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
209c0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
209d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
209e0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
209f0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  g;.          PAG
20a00 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41  ERTRACE5("JOURNA
20a10 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
20a20 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
20a30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
20a40 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
20a50 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
20a60 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
20a70 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
20a80 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20  (pPg));.        
20a90 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20    *(u32*)pEnd = 
20aa0 73 61 76 65 64 3b 0a 0a 20 20 20 20 20 20 20 20  saved;..        
20ab0 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
20ac0 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
20ad0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
20ae0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
20af0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
20b00 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
20b10 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
20b20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
20b30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
20b40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20b60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20b70 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
20b80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
20b90 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
20ba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20bb0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
20bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
20bd0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
20be0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
20bf0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
20c00 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
20c10 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
20c20 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
20c30 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
20c40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20c50 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
20c60 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
20c70 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
20c80 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
20c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20ca0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
20cb0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
20cc0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
20cd0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
20ce0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
20cf0 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
20d00 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
20d10 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
20d20 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
20d30 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
20d40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
20d50 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
20d60 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
20d70 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
20d80 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
20d90 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
20da0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
20db0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
20dc0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
20dd0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
20de0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
20df0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
20e00 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
20e10 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
20e20 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
20e30 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
20e40 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
20e50 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
20e60 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
20e70 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
20e80 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
20e90 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
20ea0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
20eb0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
20ec0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
20ed0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
20ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20ef0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20f00 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
20f10 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
20f20 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
20f30 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
20f40 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
20f50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20f60 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
20f70 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
20f80 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
20f90 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
20fa0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
20fb0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
20fc0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
20fd0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
20fe0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20ff0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
21000 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
21010 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
21020 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
21030 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
21040 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
21050 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
21060 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
21070 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
21080 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
21090 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
210a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
210b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
210c0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
210d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
210e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
210f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
21100 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
21110 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
21120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21130 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
21140 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
21150 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
21160 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
21170 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
21180 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
21190 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
211a0 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74  )-4;.        put
211b0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
211c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
211d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
211e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
211f0 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  tfd, pData2, pPa
21200 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
21210 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
21220 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
21230 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
21240 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
21250 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21260 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
21270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
21290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
212a0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
212b0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
212c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
212d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
212e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
212f0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
21300 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
21310 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
21320 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21330 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
21340 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
21350 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
21360 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
21370 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
21380 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
21390 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
213a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
213b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
213c0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
213d0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
213e0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
213f0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
21400 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
21410 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
21420 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
21430 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
21460 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
21470 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
21480 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
21490 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
214a0 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
214b0 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
214c0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
214d0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
214e0 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
214f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
21500 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
21510 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
21520 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
21530 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
21540 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
21550 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
21560 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
21570 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
21580 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
21590 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
215a0 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
215b0 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
215c0 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
215d0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
215e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
215f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
21600 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
21610 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21620 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
21630 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
21640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21650 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
21660 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
21670 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21680 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
21690 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
216a0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
216b0 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
216c0 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ize);..  pagerEn
216d0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
216e0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
216f0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
21700 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
21710 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
21720 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
21730 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
21740 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
21750 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
21760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21770 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
21780 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
21790 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
217a0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
217b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
217c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
217d0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
217e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
217f0 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
21800 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
21810 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
21820 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
21830 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
21840 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
21850 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
21860 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
21870 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
21880 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
21890 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
218a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
218b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
218c0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
218d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
218e0 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
218f0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
21900 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
21910 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
21920 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
21930 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
21940 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
21950 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
21960 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
21970 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
21980 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
21990 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
219a0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
219b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
219c0 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
219d0 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
219e0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
219f0 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
21a00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
21a10 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
21a20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
21a30 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
21a40 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
21a50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
21a60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21a70 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
21a80 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
21a90 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
21aa0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
21ab0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
21ac0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
21ad0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
21ae0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
21af0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
21b00 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
21b10 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
21b20 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
21b30 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
21b40 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
21b50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
21b60 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
21b70 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
21b80 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
21b90 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  age;.      if( !
21ba0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
21bb0 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70  al || pg==pPg->p
21bc0 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  gno || .        
21bd0 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69    pg>pPager->ori
21be0 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61  gDbSize || !(pPa
21bf0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
21c00 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29  pg/8]&(1<<(pg&7)
21c10 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20  )).      ) {.   
21c20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
21c30 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
21c40 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
21c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21c60 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
21c70 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
21c80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21c90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21ca0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21cb0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
21cc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
21cd0 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
21ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
21cf0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
21d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
21d20 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
21d30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
21d50 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
21d60 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
21d70 67 65 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20  ger, pg)) ){.   
21d80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
21d90 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
21da0 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
21db0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
21dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21dd0 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72   /* If the PgHdr
21de0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
21df0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
21e00 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
21e10 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
21e20 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
21e30 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
21e40 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
21e50 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
21e60 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
21e70 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
21e80 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
21e90 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
21ea0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
21eb0 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
21ec0 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
21ed0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
21ee0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
21ef0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
21f00 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
21f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21f20 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
21f30 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
21f40 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
21f50 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53  i<nPage && needS
21f60 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ync; ii++){.    
21f70 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
21f80 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
21f90 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
21fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
21fb0 67 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64  ge ) pPage->need
21fc0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
21fd0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
21fe0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
21ff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
22000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
22010 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
22020 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
22030 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
22040 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
22050 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
22060 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
22070 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
22080 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22090 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
220a0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
220b0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
220c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
220d0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
220e0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
220f0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
22100 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
22110 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
22120 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
22130 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
22140 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
22150 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22160 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
22170 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
22180 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
22190 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
221a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
221b0 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
221c0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
221d0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
221e0 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
221f0 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
22200 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
22210 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22220 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  rOverwrite(Pager
22230 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
22240 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
22250 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
22260 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61  .  int rc;..  pa
22270 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
22280 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22290 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
222a0 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
222b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
222c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
222d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
222e0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
222f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22300 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
22310 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
22320 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
22330 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22350 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
22360 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
22370 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
22380 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
22390 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
223a0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
223b0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
223c0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
223d0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
223e0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
223f0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
22400 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
22410 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
22420 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
22430 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
22440 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  irty..**.** The 
22450 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
22460 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
22470 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
22480 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
22490 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
224a0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
224b0 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
224c0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
224d0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
224e0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
224f0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
22500 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
22510 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
22520 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
22530 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
22540 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
22550 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
22560 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
22570 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
22580 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
22590 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
225a0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
225b0 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
225c0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
225d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
225e0 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
225f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
22600 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
22610 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
22620 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
22630 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
22640 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
22650 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
22660 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
22670 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
22680 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
22690 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
226a0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
226b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
226c0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
226d0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
226e0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
226f0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
22700 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
22710 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
22720 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
22730 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
22740 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
22750 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
22760 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
22770 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
22780 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
22790 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
227a0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
227b0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
227c0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
227d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
227e0 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
227f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
22800 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
22810 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
22820 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
22830 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
22840 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
22850 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
22860 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
22870 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
22880 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
22890 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
228a0 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
228b0 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
228c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
228d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
228e0 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  f( MEMDB ) retur
228f0 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  n;.  pagerEnter(
22900 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
22910 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
22920 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
22930 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
22940 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
22950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22960 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
22970 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
22980 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
22990 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
229a0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
229b0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
229c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
229d0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
229e0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
229f0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
22a00 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
22a10 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
22a20 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
22a30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
22a40 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
22a50 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
22a60 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
22a70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22a80 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
22a90 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
22aa0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
22ab0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
22ac0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
22ad0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
22ae0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
22af0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
22b00 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
22b10 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
22b20 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
22b30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
22b40 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
22b50 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
22b60 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
22b70 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
22b80 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
22b90 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
22ba0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
22bb0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
22bc0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
22bd0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
22be0 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
22bf0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
22c00 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
22c10 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
22c20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
22c30 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
22c40 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
22c50 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
22c60 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
22c70 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
22c80 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
22c90 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
22ca0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
22cb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
22cc0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
22cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
22ce0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
22cf0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
22d00 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
22d10 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
22d20 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
22d30 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
22d40 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
22d50 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
22d60 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
22d70 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
22d80 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
22d90 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
22da0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
22db0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
22dc0 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
22dd0 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
22de0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22df0 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
22e00 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
22e10 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
22e20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
22e30 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
22e40 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
22e50 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
22e60 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
22e70 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
22e80 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
22e90 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
22ea0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
22eb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
22ec0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22ed0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
22ee0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
22ef0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
22f00 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70  Pg->pPager;..  p
22f10 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
22f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
22f30 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
22f40 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
22f50 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
22f60 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
22f70 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
22f80 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
22f90 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
22fa0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
22fb0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
22fc0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
22fd0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
22fe0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
22ff0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
23000 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23010 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
23020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
23030 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
23040 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
23050 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
23060 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
23070 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  1;.    pPg->need
23080 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66  Read = 0;.    if
23090 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
230a0 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
230b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
230c0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
230d0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
230e0 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52     }.    PAGERTR
230f0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
23100 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
23110 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
23120 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23130 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
23140 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
23150 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
23160 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
23170 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
23180 73 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49  se .   && !pageI
23190 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
231a0 0a 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d  .   && (int)pPg-
231b0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
231c0 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  tmtSize .  ){.  
231d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
231e0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
231f0 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
23200 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
23210 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23220 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
23230 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
23240 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
23250 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
23260 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 70  pgno&7);.  }.  p
23270 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
23280 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
23290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
232a0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
232b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
232c0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
232d0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
232e0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
232f0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
23300 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
23310 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
23320 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
23330 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
23340 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
23350 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
23360 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
23370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
23380 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
23390 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
233a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
233b0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
233c0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
233d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
233e0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
233f0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
23400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23410 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
23420 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
23430 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
23440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23450 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
23460 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23470 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
23480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
23490 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
234a0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
234b0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
234c0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
234d0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
234e0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
234f0 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
23500 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
23510 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
23520 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
23530 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54  (((char*)PGHDR_T
23540 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b  O_DATA(pPgHdr))+
23550 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
23560 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73  er);..    if( is
23570 44 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72  Direct && pPager
23580 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
23590 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f  {.      const vo
235a0 69 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52  id *zBuf = PGHDR
235b0 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
235c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
235d0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
235e0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
235f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
23600 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
23610 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
23620 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
23630 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
23640 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
23650 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
23660 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
23670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
23690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
236a0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
236b0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
236c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
236d0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
236e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
236f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
23700 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
23710 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
23720 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
23730 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
23740 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
23750 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
23760 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
23770 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
23780 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
23790 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
237a0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
237b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
237c0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
237d0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
237e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
237f0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
23800 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
23810 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
23820 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
23830 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
23840 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
23850 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
23860 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
23870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
23880 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
23890 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
238a0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
238b0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
238c0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
238d0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
238e0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
238f0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
23900 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
23910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
23920 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
23930 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
23940 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
23950 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
23960 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
23970 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
23980 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
23990 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ses)..*/.int sql
239a0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
239b0 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70  haseOne(Pager *p
239c0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
239d0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
239e0 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
239f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23a00 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
23a10 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
23a20 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
23a30 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
23a40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
23a50 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
23a60 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61  r, nTrunc);.  pa
23a70 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
23a80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
23a90 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
23aa0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
23ab0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
23ac0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
23ad0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
23ae0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
23af0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
23b00 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
23b10 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
23b20 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
23b30 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
23b40 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
23b50 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23    PgHdr *pPg;..#
23b60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23b70 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
23b80 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d  .    /* The atom
23b90 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
23ba0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
23bb0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a  d if all of the.
23bc0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
23bd0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
23be0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  *.    **    + Th
23bf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
23c00 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
23c10 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
23c20 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20   for.    **     
23c30 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
23c40 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20  page-size, and. 
23c50 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20     **    + This 
23c60 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
23c70 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
23c80 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
23c90 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  and.    **    + 
23ca0 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  Exactly one page
23cb0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
23cc0 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ed and store in 
23cd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23ce0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23cf0 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
23d00 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ion can be used,
23d10 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23d20 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
23d30 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61  r.    ** be crea
23d40 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
23d50 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsaction..    */
23d60 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d  .    int useAtom
23d70 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20  icWrite = (.    
23d80 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20      !zMaster && 
23d90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
23da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
23db0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
23dc0 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
23dd0 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20  nTrunc==0 && .  
23de0 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72        (0==pPager
23df0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70  ->pDirty || 0==p
23e00 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
23e10 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20  Dirty).    );.  
23e20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57    if( useAtomicW
23e30 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rite ){.      /*
23e40 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   Update the nRec
23e50 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f   field in the jo
23e60 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
23e70 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20       int offset 
23e80 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
23e90 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
23ea0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
23eb0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
23ec0 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20  r->nRec==1);.   
23ed0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
23ee0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
23ef0 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d   offset, pPager-
23f00 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f  >nRec);..      /
23f10 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
23f20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
23f30 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ter. The followi
23f40 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
23f50 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ify.      ** the
23f60 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
23f70 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
23f80 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  e 1 to include t
23f90 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20  he updated.     
23fa0 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74   ** change count
23fb0 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
23fc0 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c  e page 1 directl
23fd0 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
23fe0 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e  e.      ** file.
23ff0 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
24000 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
24010 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
24020 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a  t file-system, .
24030 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
24040 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   safe..      */.
24050 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
24060 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
24070 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
24080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
240a0 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
240b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
240c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
240d0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
240e0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
240f0 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74  ( !useAtomicWrit
24100 65 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  e ).#endif..    
24110 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
24120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
24130 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24140 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
24150 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
24160 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
24170 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
24180 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
24190 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
241a0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
241b0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
241c0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
241d0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
241e0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
241f0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
24200 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
24210 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
24220 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
24230 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
24240 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
24250 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
24260 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
24270 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
24280 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
24290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
242a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
242b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
242c0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
242d0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
242e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
242f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
24300 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
24310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24320 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
24330 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
24340 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
24350 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
24360 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
24370 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
24380 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
24390 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
243a0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
243b0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
243c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
243d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
243e0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
243f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
24400 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
24410 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
24420 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
24430 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
24440 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
24450 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
24460 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
24470 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
24480 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
24490 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
244a0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
244b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
244c0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
244d0 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
244e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
244f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
24500 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
24510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24520 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24530 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
24540 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24550 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
24560 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
24570 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
24580 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
24590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
245a0 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
245b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
245c0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
245d0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
245e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
245f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
24600 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
24610 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
24620 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
24630 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24640 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
24650 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65  nc_exit;..#ifnde
24660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24670 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
24680 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
24690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
246a0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
246b0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
246c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
246d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
246e0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
246f0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
24700 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
24710 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
24720 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
24730 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
24740 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
24750 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
24760 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
24770 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
24780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  OK ){.      whil
247a0 65 28 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e  e( pPg && !pPg->
247b0 64 69 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70  dirty ){ pPg = p
247c0 50 67 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20  Pg->pDirty; }.  
247d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
247e0 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ty = pPg;.      
247f0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
24800 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
24810 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
24820 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
24830 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
24840 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
24850 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
24860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24870 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
24880 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
24890 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
248a0 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
248b0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
248c0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
248d0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
248e0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
248f0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
24900 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
24910 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
24920 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
24930 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
24940 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
24950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
24960 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
24970 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
24980 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
24990 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
249a0 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
249b0 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
249c0 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
249d0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
249e0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
249f0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
24a00 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
24a10 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
24a20 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a  ent, it's.     *
24a30 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
24a40 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
24a50 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
24a60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
24a70 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
24a80 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
24a90 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
24aa0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
24ab0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24ac0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
24ad0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
24ae0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
24af0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
24b00 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
24b10 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
24b20 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
24b30 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24b40 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
24b50 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
24b60 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
24b70 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
24b80 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
24b90 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
24ba0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
24bb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
24bc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
24bd0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
24be0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
24bf0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
24c00 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
24c10 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
24c20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24c30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61  _ERROR;.  }.  pa
24c40 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
24c50 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
24c60 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
24c70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
24c80 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
24c90 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
24ca0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
24cb0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
24cc0 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
24cd0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
24ce0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
24cf0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
24d00 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
24d10 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
24d20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
24d30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
24d40 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
24d50 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
24d60 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
24d70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
24d80 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
24d90 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
24da0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
24db0 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
24dc0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
24dd0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
24de0 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
24df0 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
24e00 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
24e10 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
24e20 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
24e30 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
24e40 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
24e50 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
24e60 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
24e70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
24e80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
24e90 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
24ea0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24eb0 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
24ec0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
24ed0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
24ee0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
24ef0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
24f00 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
24f10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24f20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
24f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
24f40 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
24f50 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65  yCache );.  asse
24f60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
24f70 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
24f80 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
24f90 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
24fa0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
24fb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
24fc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
24fd0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
24fe0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
24ff0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
25000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
25010 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
25020 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
25030 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
25040 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
25050 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
25060 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
25070 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
25080 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
25090 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
250a0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
250b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
250c0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
250d0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
250e0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
250f0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
25100 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
25110 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
25120 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
25130 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
25140 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
25150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25160 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
25170 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
25180 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
25190 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
251a0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
251b0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
251c0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
251d0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
251e0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
251f0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
25200 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
25210 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25220 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
25230 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
25240 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41  t rc;.  PAGERTRA
25250 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
25260 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
25270 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
25280 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
25290 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
252a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
252b0 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
252c0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
252d0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
252e0 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
252f0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
25300 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
25310 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
25320 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
25330 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
25340 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
25350 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
25360 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
25370 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
25380 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
25390 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
253a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
253b0 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
253c0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
253d0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
253e0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
253f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
25400 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
25410 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
25420 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
25430 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50  Size);.        P
25440 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c  AGERTRACE3("ROLL
25450 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
25460 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
25470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
25480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25490 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
254a0 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
254b0 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
254c0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
254d0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
254e0 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
254f0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
25500 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
25510 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
25520 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
25530 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
25540 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
25550 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
25560 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
25570 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
25580 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
25590 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
255a0 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
255b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
255c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
255d0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
255e0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
255f0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
25600 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25610 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
25620 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Size;.    pager_
25630 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
25640 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
25650 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
25660 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
25670 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
25680 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
25690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
256a0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
256b0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ger);.  if( !pPa
256c0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
256d0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
256e0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
256f0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
25700 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
25710 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
25720 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
25730 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
25740 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
25750 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
25760 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
25770 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
25780 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
25790 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
257a0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
257b0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
257c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
257d0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
257e0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
257f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
25800 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
25810 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
25820 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
25830 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
25840 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
25850 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
25860 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
25870 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
25880 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
25890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
258a0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
258b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
258c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
258d0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
258e0 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73  }.  /* pager_res
258f0 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
25900 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25910 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
25920 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
25930 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
25940 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
25950 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
25960 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
25970 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
25980 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
25990 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
259a0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
259b0 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
259c0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
259d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
259e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
259f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
25a00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25a10 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
25a20 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
25a30 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
25a40 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
25a50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
25a60 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
25a70 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
25a80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
25a90 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
25aa0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25ab0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
25ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25ad0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
25ae0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
25af0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
25b00 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
25b10 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
25b20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
25b30 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23  ager->nRef;.}..#
25b40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
25b50 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
25b60 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
25b70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
25b80 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
25b90 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
25ba0 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
25bb0 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
25bc0 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
25bd0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
25be0 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
25bf0 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
25c00 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
25c10 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
25c20 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
25c30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
25c40 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
25c50 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
25c60 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
25c70 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
25c80 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
25c90 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
25ca0 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
25cb0 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
25cc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
25cd0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
25ce0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
25cf0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
25d00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
25d10 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
25d20 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
25d30 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
25d40 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
25d50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
25d60 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
25d70 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
25d80 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
25d90 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
25da0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
25db0 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
25dc0 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
25dd0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
25de0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
25df0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
25e00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
25e10 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
25e20 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25e30 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
25e40 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
25e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25e60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
25e70 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
25e80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
25e90 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45  ize>=0 );.  PAGE
25ea0 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45  RTRACE2("STMT-BE
25eb0 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
25ec0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
25ed0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
25ee0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
25ef0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
25f00 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
25f10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
25f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25f30 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
25f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
25f50 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
25f60 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
25f70 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
25f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25f90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25fa0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
25fb0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25fc0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
25fd0 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33  InStmt = sqlite3
25fe0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67  MallocZero( pPag
25ff0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
26000 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72   );.  pagerEnter
26010 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
26020 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
26030 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
26040 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
26050 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
26060 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
26070 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26080 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
26090 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
260a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
260b0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
260c0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
260d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
260e0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
260f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26100 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
26110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26120 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
26130 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
26140 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
26150 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
26160 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
26170 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
26180 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
26190 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
261a0 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
261b0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
261c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
261d0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
261e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
261f0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d  Opentemp(pPager-
26200 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73  >pVfs, pPager->s
26210 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tfd, 0);.    if(
26220 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
26230 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
26240 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
26250 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
26260 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
26270 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
26280 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
26290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
262a0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
262b0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
262c0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
262d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
262e0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
262f0 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
26300 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
26310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26320 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26330 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
26340 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26350 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
26360 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
26370 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
26380 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
26390 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
263a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
263b0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
263c0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
263d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
263e0 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
263f0 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e  ager){.  pagerEn
26400 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
26410 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
26420 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
26430 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
26440 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
26450 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
26460 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26470 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
26480 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
26490 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
264a0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
264b0 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
264c0 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67  lite3_free( pPag
264d0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
264e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
264f0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
26500 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
26510 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
26520 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
26530 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
26540 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
26550 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
26560 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
26570 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
26580 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
26590 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
265a0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
265b0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
265c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
265d0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
265e0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
265f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
26600 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
26610 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
26620 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
26630 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
26640 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
26650 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
26660 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
26670 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
26680 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
26690 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
266a0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
266b0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
266c0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
266d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
266e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
266f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
26700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
26710 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
26720 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26730 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
26740 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
26750 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
26760 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
26770 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
26780 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
26790 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
267a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
267b0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
267c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
267d0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
267e0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
267f0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
26800 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
26810 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
26820 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
26830 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
26840 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
26850 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
26860 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
26870 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
26880 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
26890 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
268a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
268b0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
268c0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
268d0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
268e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
268f0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
26900 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
26910 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
26920 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
26930 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
26940 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26950 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
26960 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
26970 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
26980 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
26990 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
269a0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
269b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
269c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
269d0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
269e0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
269f0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
26a00 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
26a10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
26a20 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
26a30 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
26a40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
26a50 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
26a60 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
26a70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26a80 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
26a90 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
26aa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
26ab0 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
26ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26ad0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
26ae0 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
26af0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
26b00 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
26b10 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
26b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26b30 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
26b40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
26b50 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
26b60 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
26b70 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
26b80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
26b90 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
26ba0 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
26bb0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
26bc0 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
26bd0 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
26be0 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
26bf0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
26c00 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
26c10 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
26c20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26c30 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
26c40 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
26c50 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
26c60 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
26c70 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
26c80 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
26c90 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
26ca0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
26cb0 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
26cc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
26cd0 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
26ce0 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
26cf0 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
26d00 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
26d10 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
26d20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
26d30 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
26d40 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  odecArg;.}.#endi
26d50 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
26d60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26d70 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
26d80 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63   page pPg to loc
26d90 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
26da0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
26db0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
26dc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
26dd0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
26de0 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
26df0 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
26e00 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
26e10 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
26e20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
26e30 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
26e40 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
26e50 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
26e60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
26e70 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
26e80 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
26e90 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
26ea0 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
26eb0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
26ec0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
26ed0 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
26ee0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
26ef0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
26f00 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
26f10 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
26f20 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
26f30 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
26f40 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
26f50 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
26f60 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
26f70 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
26f80 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
26f90 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
26fa0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
26fb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
26fc0 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
26fd0 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
26fe0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
26ff0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
27000 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
27010 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
27020 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
27030 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
27040 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
27050 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
27060 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
27070 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
27080 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27090 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
270a0 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
270b0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
270c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
270d0 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
270e0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
270f0 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20  . */.  int h;.  
27100 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
27110 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45  o = 0;..  pagerE
27120 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
27130 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
27140 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
27150 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
27160 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
27170 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
27180 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
27190 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
271a0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
271b0 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
271c0 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
271d0 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
271e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
271f0 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
27200 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
27210 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
27220 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
27230 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
27240 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
27250 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
27260 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
27270 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
27280 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27290 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
272a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
272b0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
272c0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
272d0 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
272e0 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
272f0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
27300 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
27310 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
27320 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
27330 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
27340 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
27350 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61   ** from it's ha
27360 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
27370 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
27380 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
27390 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
273a0 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
273b0 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
273c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
273d0 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
273e0 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
273f0 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
27400 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
27410 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
27420 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
27430 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
27440 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
27450 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
27460 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
27470 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
27480 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
27490 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
274a0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
274b0 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e  Sync = pPgOld->n
274c0 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65  eedSync;.  }else
274d0 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  {.    pPg->needS
274e0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ync = 0;.  }.  i
274f0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
27500 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
27510 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
27520 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50  DbSize ){.    pP
27530 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20  g->inJournal =  
27540 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
27550 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
27560 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
27570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
27580 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
27590 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
275a0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c  g->needSync==0 |
275b0 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
275c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
275d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  ;.  }..  /* Chan
275e0 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
275f0 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
27600 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
27610 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
27620 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
27630 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
27640 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
27650 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
27660 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
27670 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
27680 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
27690 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
276a0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
276b0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
276c0 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
276d0 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
276e0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
276f0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
27700 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
27710 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
27720 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
27730 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
27740 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
27750 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
27760 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
27770 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
27780 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
27790 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
277a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
277b0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
277c0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
277d0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
277e0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
277f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
27800 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
27810 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
27820 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
27830 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
27840 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
27850 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49  .    ** Pager.aI
27860 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
27870 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
27880 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
27890 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
278a0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
278b0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
278c0 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
278d0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
278e0 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
278f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
27900 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
27910 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
27920 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
27930 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
27940 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
27950 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
27960 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
27970 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
27980 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
27990 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
279a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
279b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
279c0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
279d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
279e0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
279f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27a10 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
27a20 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
27a30 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
27a40 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
27a50 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
27a60 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
27a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
27a80 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
27a90 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61  .  }..  pagerLea
27aa0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
27ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27ac0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27ad0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
27ae0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
27af0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
27b00 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
27b10 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
27b20 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
27b30 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
27b40 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
27b50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
27b60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
27b70 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
27b80 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
27b90 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
27ba0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
27bb0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
27bc0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
27bd0 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
27be0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
27bf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
27c00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
27c10 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52  rn (pPager?PGHDR
27c20 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
27c30 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Pager):0);.}../*
27c40 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
27c50 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
27c60 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
27c70 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
27c80 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
27c90 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
27ca0 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
27cb0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
27cc0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
27cd0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
27ce0 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
27cf0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
27d00 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
27d10 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
27d20 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
27d30 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
27d40 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
27d50 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
27d60 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
27d70 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
27d80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
27d90 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
27da0 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
27db0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
27dc0 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
27dd0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
27de0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
27df0 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
27e00 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
27e10 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
27e20 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
27e30 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
27e40 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
27e50 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
27e60 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
27e70 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
27e80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
27e90 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
27ea0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
27eb0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
27ec0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
27ed0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
27ee0 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
27ef0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
27f00 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
27f10 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
27f20 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
27f30 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
27f40 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
27f50 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20   = eMode;.  }.  
27f60 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
27f70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
27f80 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  e;.}..#if define
27f90 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
27fa0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27fb0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27fc0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
27fd0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
27fe0 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
27ff0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
28000 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
28010 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
28020 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
28030 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
28040 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
28050 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
28060 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
28070 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61 74 65  e3PagerLockstate
28080 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28090 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
280a0 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61  3OsLockState(pPa
280b0 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64  ger->fd);.}.#end
280c0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
280d0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
280e0 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  int a listing of
280f0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20   all referenced 
28100 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20  pages and their 
28110 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f  ref count..*/.vo
28120 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
28130 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
28140 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
28150 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
28160 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
28170 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
28180 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
28190 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
281a0 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
281b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
281c0 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20  AGE %3d addr=%p 
281d0 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
281e0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50      pPg->pgno, P
281f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
28200 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
28210 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e   }.}.#endif..#en
28220 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
28230 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.