/ Hex Artifact Content
Login

Artifact 7ce0a4abcc7e096adbd79277bb7c048ae24190f1:


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 34 35  : pager.c,v 1.45
0350: 35 20 32 30 30 38 2f 30 36 2f 30 37 20 30 35 3a  5 2008/06/07 05:
0360: 31 39 3a 33 38 20 64 61 6e 69 65 6c 6b 31 39 37  19:38 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 73 20 61 72 67 75  ruct as its argu
0690: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
06a0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
06b0: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
06c0: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06d0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06e0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06f0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
0700: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
0710: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0720: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0730: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0740: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0750: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0760: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0770: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0790: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
07a0: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
07b0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07c0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07e0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
0800: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0810: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0820: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0840: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0850: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0860: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0890: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
08a0: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
08b0: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08c0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08f0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
0900: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here 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 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0930: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0940: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0950: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0960: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0970: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0990: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
09a0: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
09b0: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09c0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09f0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
0a00: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
0a10: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a40: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a50: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a60: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a90: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0aa0: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ad0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ae0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0af0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b20: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b30: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b40: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b70: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b80: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0ba0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0bc0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bd0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0be0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0c10: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c20: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c30: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c40: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c50: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c60: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c80: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c90: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0ca0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cd0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0ce0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cf0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d10: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d20: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d30: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d90: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0da0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0db0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0dc0: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0dd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0de0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0df0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0e00: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0e10: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0e20: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e30: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e40: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e50: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e60: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e70: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e80: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e90: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0ea0: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0eb0: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0ec0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ed0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0ee0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ef0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f00: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f10: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f20: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f30: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f40: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f50: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f60: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f70: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f80: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f90: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0fa0: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0fb0: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0fc0: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fd0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fe0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0ff0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
1000: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1010: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
1020: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1030: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1050: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1060: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1070: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1080: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1090: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
10a0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
10b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
10c0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10d0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10e0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10f0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
1100: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
1110: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1130: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1140: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1150: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1160: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1170: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1180: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1190: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
11a0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
11b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
11c0: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11d0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
1200: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
1210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
1220: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1230: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1240: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1250: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1260: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1270: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1280: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1290: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
12a0: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
12b0: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
12c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12d0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12e0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12f0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
1300: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1310: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
1320: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1330: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1340: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1350: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1360: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1370: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1380: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1390: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
13a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13b0: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
13c0: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13d0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13e0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13f0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
1400: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
1410: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
1420: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1430: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1440: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1450: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1460: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1470: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1480: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1490: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
14a0: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
14b0: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
14c0: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14d0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14e0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1500: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
1510: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
1520: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1540: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1550: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1560: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1570: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1580: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1590: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
15a0: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
15b0: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
15c0: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15d0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15e0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15f0: 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66 20 73  )&~7)..typedef s
1600: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
1610: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 70  r;../*.** Each p
1620: 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c 6c 20  ager stores all 
1630: 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 66 65  currently unrefe
1640: 72 65 6e 63 65 64 20 70 61 67 65 73 20 69 6e 20  renced pages in 
1650: 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a 2a 2a  a list sorted.**
1660: 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65 6e 74   in least-recent
1670: 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20 6f 72  ly-used (LRU) or
1680: 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20 66 69  der (i.e. the fi
1690: 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  rst item on the 
16a0: 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e 6f 74  list has .** not
16b0: 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
16c0: 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d 65 2c   in a long time,
16d0: 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 68   the last item h
16e0: 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74 6c 79  as been recently
16f0: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20 69 6e  .** used). An in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1710: 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 63 6c  tructure is incl
1720: 75 64 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  uded as part of 
1730: 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20 73 74  each.** pager st
1740: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1750: 20 70 75 72 70 6f 73 65 20 28 76 61 72 69 61 62   purpose (variab
1760: 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e 0a 2a  le Pager.lru)..*
1770: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1780: 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  y, if memory-man
1790: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
17a0: 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ed, all unrefere
17b0: 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a 20 61  nced pages .** a
17c0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 67  re stored in a g
17d0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 20 28  lobal LRU list (
17e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
17f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1800: 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  st)..**.** In bo
1810: 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 50 61  th cases, the Pa
1820: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
1830: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
1840: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1850: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
1860: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1870: 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f 65 73  g list that does
1880: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 0a   not require an.
1890: 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61  ** fsync() opera
18a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 73 20  tion before its 
18b0: 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 72 65  memory can be re
18c0: 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e 6f 20 73  claimed. If no s
18d0: 75 63 68 0a 2a 2a 20 70 61 67 65 20 65 78 69 73  uch.** page exis
18e0: 74 73 2c 20 50 61 67 65 72 4c 72 75 4c 69 73 74  ts, PagerLruList
18f0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 69 73  .pFirstSynced is
1900: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
1910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1920: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50 61 67  PagerLruList Pag
1930: 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72 75 63  erLruList;.struc
1940: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 7b  t PagerLruList {
1950: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1960: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ;         /* Fir
1970: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
1980: 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1990: 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
19a0: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
19b0: 4c 52 55 20 6c 69 73 74 20 28 74 68 65 20 6d 6f  LRU list (the mo
19c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
19d0: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  ) */.  PgHdr *pF
19e0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a  irstSynced;   /*
19f0: 20 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c   First page in l
1a00: 69 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ist with PgHdr.n
1a10: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b  eedSync==0 */.};
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1a40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 78  contains the nex
1a50: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 70  t and previous p
1a60: 6f 69 6e 74 65 72 73 20 75 73 65 64 0a 2a 2a 20  ointers used.** 
1a70: 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48 64 72 20  to link a PgHdr 
1a80: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 61  structure into a
1a90: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 69   PagerLruList li
1aa0: 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a 2f 0a 74  nked list. .*/.t
1ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1ac0: 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61 67 65 72  gerLruLink Pager
1ad0: 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20  LruLink;.struct 
1ae0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 7b 0a 20  PagerLruLink {. 
1af0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
1b00: 20 50 67 48 64 72 20 2a 70 50 72 65 76 3b 0a 7d   PgHdr *pPrev;.}
1b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  ;../*.** Each in
1b20: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1b30: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1b40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1b50: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1b60: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1b70: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1b80: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1b90: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1ba0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1bb0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1bc0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1bd0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1be0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1bf0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1c00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c10: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1c20: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1c30: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1c40: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1c50: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1c60: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c70: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1c80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1c90: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1ca0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cb0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1cc0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1cd0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1ce0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1cf0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1d00: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1d10: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1d20: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1d30: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1d40: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1d50: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1d60: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1d70: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1d80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1d90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1da0: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1db0: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1dc0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1dd0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1de0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1df0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1e00: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1e10: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1e20: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1e30: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e40: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1e50: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1e60: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1e70: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1e80: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1e90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1ea0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ile..**.** Detai
1eb0: 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20  ls of important 
1ec0: 73 74 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e  structure elemen
1ed0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ts:.**.** needSy
1ee0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  nc.**.**     If 
1ef0: 74 68 69 73 20 69 73 20 74 72 75 65 2c 20 74 68  this is true, th
1f00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74  is means that it
1f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
1f20: 77 72 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a  write the page.*
1f30: 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f  *     content to
1f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1f50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
1f60: 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65  al content neede
1f70: 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c  d.**     for rol
1f80: 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79  lback has not by
1f90: 20 73 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d   synced to the m
1fa0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
1fb0: 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65  rnal..**     The
1fc0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1fd0: 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  t may have been 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72  written to the r
1ff0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
2000: 2a 2a 20 20 20 20 20 62 75 74 20 69 74 20 68 61  **     but it ha
2010: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73  s not yet been s
2020: 79 6e 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61  ynced.  So we ca
2030: 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68  nnot write to th
2040: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2050: 20 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 70    file because p
2060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67  ower failure mig
2070: 68 74 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ht cause the pag
2080: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
2090: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20   file.**     to 
20a0: 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 65 20  never reach the 
20b0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20  disk.  It is as 
20c0: 69 66 20 74 68 65 20 77 72 69 74 65 20 74 6f 20  if the write to 
20d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e0: 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74  .**     does not
20f0: 20 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65   occur until the
2100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2110: 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20   synced..**     
2120: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2130: 67 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  g is false if th
2140: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65  e page content e
2150: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77  xactly matches w
2160: 68 61 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65  hat.**     curre
2170: 6e 74 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74  ntly exists in t
2180: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2190: 2e 20 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20  .  The needSync 
21a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  flag is also.** 
21b0: 20 20 20 20 66 61 6c 73 65 20 69 66 20 74 68 65      false if the
21c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21d0: 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  t has been writt
21e0: 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  en to the main r
21f0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a  ollback.**     j
2200: 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65  ournal and synce
2210: 64 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  d.  If the page 
2220: 72 65 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77  represents a new
2230: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a   page that has.*
2240: 2a 20 20 20 20 20 62 65 65 6e 20 61 64 64 65 64  *     been added
2250: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
2270: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
2280: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
2290: 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e  ion, the needSyn
22a0: 63 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 75  c flag is true u
22b0: 6e 74 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61  ntil the origina
22c0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  l database.**   
22d0: 20 20 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f    size in the jo
22e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
22f0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2300: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f  disk..**.** inJo
2310: 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urnal.**.**     
2320: 54 68 69 73 20 69 73 20 74 72 75 65 20 69 66 20  This is true if 
2330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2340: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2350: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
2360: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
2370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
2380: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
2390: 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 61 64  for new pages ad
23a0: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
23b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23c0: 61 62 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e  abase file durin
23d0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20  ansaction..**   
23f0: 20 20 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20    And this flag 
2400: 73 61 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f  says nothing abo
2410: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
2420: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  t the journal.**
2430: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 73 79       has been sy
2440: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46  nced to disk.  F
2450: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 61 72  or pages that ar
2460: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
2470: 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73  l.**     databas
2480: 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  e file, the foll
2490: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
24a0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
24b0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24c0: 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20      inJournal = 
24d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24e0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24f0: 72 6e 61 6c 2c 20 70 67 6e 6f 29 0a 2a 2a 0a 2a  rnal, pgno).**.*
2500: 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65 72  *     The pPager
2510: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 6f 62 6a  ->pInJournal obj
2520: 65 63 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ect is only vali
2530: 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  d for the origin
2540: 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  al.**     pages 
2550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
2560: 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74   not new pages t
2570: 68 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f  hat are added to
2580: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
2590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
25a0: 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68   so obviously th
25b0: 65 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69  e above expressi
25c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  on cannot be.** 
25d0: 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65      valid for ne
25e0: 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65  w pages.  For ne
25f0: 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61  w pages inJourna
2600: 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a  l is always 0..*
2610: 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a  *.** dirty.**.**
2620: 20 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20       When true, 
2630: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2650: 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2660: 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64  .**     modified
2670: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2680: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61  le..**     If fa
26b0: 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  lse, it means th
26c0: 61 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  at either the co
26d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
26e0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68  e is.**     unch
26f0: 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68  anged or else th
2700: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69  e content is uni
2710: 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20  mportant and we 
2720: 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61  do not.**     ca
2730: 72 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  re whether or no
2740: 74 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65  t it is preserve
2750: 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52  d..**.** alwaysR
2760: 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  ollback.**.**   
2770: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2780: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2790: 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
27a0: 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a   API should be.*
27b0: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f  *     ignored fo
27c0: 72 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68  r this page.  Th
27d0: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
27e0: 20 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f   API attempts to
27f0: 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74   say.**     that
2800: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2810: 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b  the page on disk
2820: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2830: 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20  (it is an.**    
2840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20   unused page on 
2850: 74 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f  the freelist) so
2860: 20 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65   that it is unne
2870: 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20  cessary to .**  
2880: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e     rollback chan
2890: 67 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65  ges to this page
28a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
28b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
28c0: 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e  .**     can chan
28d0: 67 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ge without chang
28e0: 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  ing the meaning 
28f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2900: 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c    This.**     fl
2910: 61 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ag overrides any
2920: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2930: 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66  attempt.  This f
2940: 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  lag is set.**   
2950: 20 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68    when a page th
2960: 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  at originally co
2970: 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61  ntained valid da
2980: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  ta is added to.*
2990: 2a 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69  *     the freeli
29a0: 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68  st.  Later in th
29b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
29c0: 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69  on, this page mi
29d0: 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75  ght.**     be pu
29e0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  lled from the fr
29f0: 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  eelist and reuse
2a00: 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  d for something 
2a10: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20  different.**    
2a20: 20 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69   and at that poi
2a30: 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  nt the DontRollb
2a40: 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62  ack() API will b
2a50: 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65  e called because
2a60: 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61  .**     pages ta
2a70: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ken from the fre
2a80: 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65  elist do not nee
2a90: 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65  d to be protecte
2aa0: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
2ab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ac0: 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67  .  But this flag
2ad0: 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70   says that the p
2ae0: 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e  age was.**     n
2af0: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  ot originally pa
2b00: 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  rt of the freeli
2b10: 73 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74  st so that it st
2b20: 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20  ill needs to.** 
2b30: 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61      be rolled ba
2b40: 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61  ck in spite of a
2b50: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f  ny subsequent Do
2b60: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
2b70: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65  ls..**.** needRe
2b80: 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ad .**.**     Th
2b90: 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77  is flag means (w
2ba0: 68 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74  hen true) that t
2bb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2bc0: 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20  e page has.**   
2bd0: 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c    not yet been l
2be0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e  oaded from disk.
2bf0: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
2c00: 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a  content is just.
2c10: 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20  **     garbage. 
2c20: 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a   (Actually, we z
2c30: 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c  ero the content,
2c40: 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20   but you should 
2c50: 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20  not.**     make 
2c60: 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  any assumptions 
2c70: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2c80: 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29  t nevertheless.)
2c90: 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20    If the.**     
2ca0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
2cb0: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
2cc0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
2cd0: 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20  ad from the.**  
2ce0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61     original data
2cf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
2d00: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
2d10: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d30: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
2d40: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
2d50: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
2d60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2d90: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2da0: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
2db0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
2dc0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
2dd0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
2de0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72  .pgno */.  Pager
2df0: 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20  LruLink free;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e10: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66  t and previous f
2e20: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
2e30: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e50: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
2e60: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a  ages */.  u8 inJ
2e70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2e90: 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69   if has been wri
2ea0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
2eb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
2ee0: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
2ef0: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
2f00: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
2f30: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
2f40: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2f50: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f70: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2f80: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
2f90: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65   page */.  u8 ne
2fa0: 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20  edRead;         
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2fc0: 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67  d content if Pag
2fd0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
2fe0: 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  led */.  short i
2ff0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3010: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
3020: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
3030: 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72  dr *pDirty, *pPr
3040: 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44  evDirty;    /* D
3050: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69  irty pages */.#i
3060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3070: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
3080: 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c  MENT.  PagerLruL
3090: 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20  ink gfree;      
30a0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
30b0: 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20  list of nRef==0 
30c0: 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
30e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
30f0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
3100: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20  .  void *pData; 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a    /* Page data *
3130: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
3140: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
3150: 61 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  al data appended
3160: 20 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20   to this header 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
3180: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
3190: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
31a0: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
31b0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
31c0: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
31d0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
31e0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
31f0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
3200: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
3210: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
3220: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
3230: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
3250: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
3260: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
3270: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
3280: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
3290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
32a0: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
32b0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
32c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
32d0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
32e0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
32f0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
3300: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
3310: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
3320: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
3330: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
3340: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
3350: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
3360: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
3370: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
3380: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
3390: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
33a0: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
33b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
33c0: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
33d0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
33e0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
33f0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
3400: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
3410: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
3420: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
3430: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
3440: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
3450: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
3460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
3470: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3480: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
3490: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
34a0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
34b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
34c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
34d0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
3500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3510: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a  ubjournal */.};.
3520: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
3530: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
3540: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
3550: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
3560: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
3570: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
3580: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
3590: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
35a0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
35b0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
35c0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
35d0: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
35e0: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
35f0: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
3600: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
3610: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
3620: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
3630: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
3640: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3650: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
3660: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
3670: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
3680: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
3690: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
36a0: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
36b0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
36c0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
36d0: 5f 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29  _DATA(P)    ((P)
36e0: 2d 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65  ->pData).#define
36f0: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
3700: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
3710: 47 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  G)[1])).#define 
3720: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c  PGHDR_TO_HIST(P,
3730: 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20  PGR)  \.        
3740: 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a      ((PgHistory*
3750: 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b  )&((char*)(&(P)[
3760: 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74  1]))[(PGR)->nExt
3770: 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  ra])../*.** A op
3780: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
3790: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
37a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
37b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50  ructure..**.** P
37c0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
37d0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
37e0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
37f0: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f  CORRUPT, or.** o
3800: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
3810: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
3820: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
3830: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
3840: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
3850: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
3860: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
3870: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
3880: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
3890: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
38a0: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
38b0: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
38c0: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
38d0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
38e0: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
38f0: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
3900: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
3910: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
3920: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
3930: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
3940: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
3950: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
3960: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  Lookup().** APIs
3970: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
3980: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
3990: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
39a0: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
39b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
39c0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
39d0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
39e0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  r IO */.  u8 jou
39f0: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3a20: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3a30: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3a40: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3a50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3a60: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3a70: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3a80: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3aa0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ab0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3ac0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3ad0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3ae0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3af0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3b00: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3b10: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b30: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3b40: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3b50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3b60: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3b80: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
3b90: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
3ba0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
3bb0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
3bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
3bd0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
3be0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3bf0: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3c00: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3c10: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3c20: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3c30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3c40: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c60: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3c80: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
3c90: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3cb0: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
3cc0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
3cd0: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cf0: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
3d00: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
3d10: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
3d20: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
3d40: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
3d50: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
3d60: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3d80: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
3d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
3da0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
3dd0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3df0: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
3e20: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
3e30: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
3e40: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
3e50: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
3e60: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
3e70: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
3e80: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3eb0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ec0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
3ef0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
3f00: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
3f10: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f30: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3f40: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3f50: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3f60: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3f70: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3f80: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3f90: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3fa0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3fb0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3fd0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
3fe0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
3ff0: 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  es */.  u8 dbMod
4000: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
4010: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4020: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
4030: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
4040: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
4050: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
4060: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
4070: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
4080: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
4090: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40b0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
40c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
40d0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
4100: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
4110: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
4120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
4160: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4170: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
4180: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
4190: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
41a0: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
41c0: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
41d0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
41e0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
41f0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
4200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4210: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4220: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4230: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
4240: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4250: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4260: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4270: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
4290: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
42a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
42b0: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
42c0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
42d0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
42f0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
4300: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
4310: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
4320: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4340: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4350: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
4360: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
4370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
4380: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
4390: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
43a0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
43c0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
43d0: 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67  ry pages with Pg
43e0: 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20  Hdr.nRef>0 */.  
43f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4410: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4420: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
4430: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
4440: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
4450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4460: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
4470: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4480: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
4490: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
44a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
44b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
44c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
44d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e  */.  Bitvec *pIn
44e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
44f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4500: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4510: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
4520: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4550: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4560: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
45a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
45b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
45c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
45d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
45e0: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
45f0: 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  file *fd, *jfd; 
4600: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4610: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
4620: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
4630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4640: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
4650: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4660: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
4670: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4680: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
4690: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
46a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
46b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
46c0: 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75  er */.  PagerLru
46d0: 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20  List lru;       
46e0: 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20      /* LRU list 
46f0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
4700: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4720: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
4730: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
4740: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
4750: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4760: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
4770: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
4780: 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  l */.  PgHdr *pD
4790: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
47a0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
47b0: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f  l dirty pages */
47c0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
47d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
47e0: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f  * Current byte o
47f0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
4800: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
4810: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4830: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4840: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4850: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74  ader */.  i64 st
4860: 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20  mtHdrOff;       
4870: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a        /* First j
4880: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
4890: 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65  itten this state
48a0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74  ment */.  i64 st
48b0: 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  mtCksum;        
48c0: 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e        /* cksumIn
48d0: 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e  it when statemen
48e0: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f  t was started */
48f0: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
4900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4910: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
4920: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
4930: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f  ) */.  int secto
4940: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4950: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4960: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4970: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66   rollback */.#if
4980: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4990: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
49a0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
49b0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
49c0: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
49d0: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
49e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
49f0: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4a00: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4a10: 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  f.  void (*xDest
4a20: 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c  ructor)(DbPage*,
4a30: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
4a40: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
4a50: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
4a60: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
4a70: 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  ter)(DbPage*,int
4a80: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
4a90: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
4aa0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
4ab0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ac0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
4ad0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
4ae0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
4af0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
4b00: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
4b10: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
4b20: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
4b30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b40: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
4b50: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  ) */.#endif.  in
4b60: 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20  t nHash;        
4b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4b80: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4b90: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  ash table */.  P
4ba0: 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20  gHdr **aHash;   
4bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
4bc0: 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20  sh table to map 
4bd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50  page number to P
4be0: 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  gHdr */.#ifdef S
4bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4c00: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
4c10: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69  Doubly linked li
4c40: 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20  st of pagers on 
4c50: 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72  which */.  Pager
4c60: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
4c70: 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
4c80: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
4c90: 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a  () will work */.
4ca0: 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69    volatile int i
4cb0: 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 2f 2a  InUseMM;      /*
4cc0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61   Non-zero if una
4cd0: 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a  vailable to MM *
4ce0: 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74  /.  volatile int
4cf0: 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20   iInUseDB;      
4d00: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69  /* Non-zero if i
4d10: 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  n sqlite3_releas
4d20: 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65  e_memory() */.#e
4d30: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4d40: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4d50: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4d60: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4d70: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4d80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4d90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4da0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4db0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4dc0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
4dd0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
4de0: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
4df0: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
4e00: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
4e10: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   files */.};../*
4e20: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
4e30: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
4e40: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
4e50: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
4e60: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
4e70: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
4e80: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
4e90: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
4ea0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
4eb0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
4ec0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
4ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
4ee0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
4ef0: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
4f00: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
4f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
4f20: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
4f30: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
4f40: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
4f50: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
4f60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
4f70: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
4f80: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
4f90: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
4fa0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
4fb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
4fc0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
4fd0: 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  rnal */.int sqli
4fe0: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
4ff0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
5000: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  * Number of cach
5010: 65 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f  e pages freed */
5020: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
5030: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
5040: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
5050: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
5060: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
5070: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70  owing variable p
5080: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61  oints to the hea
5090: 64 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69  d of a double-li
50a0: 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  nked list.** of 
50b0: 61 6c 6c 20 70 61 67 65 72 73 20 74 68 61 74 20  all pagers that 
50c0: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
50d0: 20 70 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62   page stealing b
50e0: 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  y the.** sqlite3
50f0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
5100: 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63  ) interface.  Ac
5110: 63 65 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73  cess to this lis
5120: 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65  t is.** protecte
5130: 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
5140: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5150: 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64  2 mutex..*/.#ifd
5160: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5170: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5180: 4e 54 0a 73 74 61 74 69 63 20 50 61 67 65 72 20  NT.static Pager 
5190: 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  *sqlite3PagerLis
51a0: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61  t = 0;.static Pa
51b0: 67 65 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74  gerLruList sqlit
51c0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20  e3LruPageList = 
51d0: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69  {0, 0, 0};.#endi
51e0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  f.../*.** Journa
51f0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
5200: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
5210: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
5220: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
5230: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
5240: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
5250: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
5260: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
5270: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
5280: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
5290: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
52a0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
52b0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
52c0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
52d0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
52e0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
52f0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
5300: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5310: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5320: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5330: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5340: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5350: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5360: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5370: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
5380: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
5390: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
53a0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
53b0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
53c0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
53d0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
53e0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
53f0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5400: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5410: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5420: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5430: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5440: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5450: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5460: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5470: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
5480: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
5490: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
54a0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
54b0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
54c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
54d0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
54e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
54f0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5500: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5510: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5520: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5530: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5540: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5550: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5560: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5570: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
5580: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
5590: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
55a0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
55b0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
55c0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
55d0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
55e0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
55f0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5600: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5610: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5620: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5630: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5640: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5650: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5660: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5670: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
5680: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
5690: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
56a0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
56b0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
56c0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
56d0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
56e0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
56f0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5700: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5710: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5720: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5730: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5740: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5750: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5760: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5770: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
5780: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
5790: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
57a0: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
57b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
57c0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
57d0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
57e0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
57f0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
5800: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5810: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
5820: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
5830: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
5840: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
5850: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
5860: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
5870: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
5880: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
5890: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
58a0: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
58b0: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
58c0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
58d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
58e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
58f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
5900: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
5910: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
5920: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
5930: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
5940: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
5950: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
5960: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
5970: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
5980: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
5990: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
59a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
59b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
59c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
59d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
59e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
59f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
5a00: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
5a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5a20: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
5a30: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
5a40: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
5a50: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
5a60: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65  ndif../*.** Page
5a70: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
5a80: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
5a90: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
5aa0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
5ab0: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
5ac0: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
5ad0: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
5ae0: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
5af0: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
5b00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
5b10: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
5b20: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
5b30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b40: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
5b50: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
5b60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5b70: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
5b80: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
5b90: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
5ba0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
5bb0: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
5bc0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
5bd0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
5be0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
5bf0: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
5c00: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
5c10: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
5c20: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
5c30: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
5c40: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
5c50: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
5c60: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
5c70: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
5c80: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
5c90: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
5ca0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
5cb0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e  *.** The pagerEn
5cc0: 74 65 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c  ter() and pagerL
5cd0: 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20  eave() routines 
5ce0: 61 63 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65  acquire and rele
5cf0: 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f  ase.** a mutex o
5d00: 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20 20 54  n each pager.  T
5d10: 68 65 20 6d 75 74 65 78 20 69 73 20 72 65 63 75  he mutex is recu
5d20: 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rsive..**.** Thi
5d30: 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70  s is a special-p
5d40: 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49  urpose mutex.  I
5d50: 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20  t only provides 
5d60: 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e  mutual exclusion
5d70: 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
5d80: 42 74 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65  Btree and the Me
5d90: 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20  mory Management 
5da0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
5db0: 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63  memory().** func
5dc0: 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e  tion.  It does n
5dd0: 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20  ot prevent, for 
5de0: 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72  example, two Btr
5df0: 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69  ees from accessi
5e00: 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70  ng.** the same p
5e10: 61 67 65 72 20 61 74 20 74 68 65 20 73 61 6d 65  ager at the same
5e20: 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65   time.  Other ge
5e30: 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  neral-purpose mu
5e40: 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20  texes in.** the 
5e50: 62 74 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64  btree layer hand
5e60: 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a  le that chore..*
5e70: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5e80: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
5e90: 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69  NAGEMENT.  stati
5ea0: 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65  c void pagerEnte
5eb0: 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20  r(Pager *p){.   
5ec0: 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a   p->iInUseDB++;.
5ed0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73      if( p->iInUs
5ee0: 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65  eMM && p->iInUse
5ef0: 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e 64 65 66  DB==1 ){.#ifndef
5f00: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
5f10: 4f 50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  OP.      sqlite3
5f20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5f30: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5f40: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5f50: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5f60: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64  ATIC_MEM2);.#end
5f70: 69 66 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55  if.      p->iInU
5f80: 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20 20  seDB = 0;.      
5f90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
5fa0: 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
5fb0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5fc0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
5fd0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
5fe0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ex);.    }.    a
5ff0: 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65  ssert( p->iInUse
6000: 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73  MM==0 );.  }.  s
6010: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6020: 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29 7b  Leave(Pager *p){
6030: 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42  .    p->iInUseDB
6040: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
6050: 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20 29  p->iInUseDB>=0 )
6060: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  ;.  }.#else.# de
6070: 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28  fine pagerEnter(
6080: 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  X).# define page
6090: 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69 66  rLeave(X).#endif
60a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65  ../*.** Add page
60b0: 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64 20   pPg to the end 
60c0: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
60d0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73 74  st managed by st
60e0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74  ructure.** pList
60f0: 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74 68   (pPg becomes th
6100: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
6110: 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20 6d  the list - the m
6120: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
6130: 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e 74   used). Argument
6140: 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f   pLink should po
6150: 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50  int to either pP
6160: 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e  g->free or pPg->
6170: 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64  gfree,.** depend
6180: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 70  ing on whether p
6190: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
61a0: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
61b0: 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c  pecific or.** gl
61c0: 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a  obal LRU list..*
61d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
61e0: 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69  stAdd(PagerLruLi
61f0: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
6200: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
6210: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70  PgHdr *pPg){.  p
6220: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Link->pNext = 0;
6230: 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  .  pLink->pPrev 
6240: 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a  = pList->pLast;.
6250: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6260: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
6270: 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74  AGEMENT.  assert
6280: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72  (pLink==&pPg->fr
6290: 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50  ee || pLink==&pP
62a0: 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73  g->gfree);.  ass
62b0: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
62c0: 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21  >gfree || pList!
62d0: 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  =&sqlite3LruPage
62e0: 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  List);.#endif.. 
62f0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73   if( pList->pLas
6300: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  t ){.    int iOf
6310: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
6320: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
6330: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
6340: 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28  k *pLastLink = (
6350: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
6360: 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70  &((u8 *)pList->p
6370: 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Last)[iOff]);.  
6380: 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65    pLastLink->pNe
6390: 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73  xt = pPg;.  }els
63a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70  e{.    assert(!p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20  List->pFirst);. 
63c0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
63d0: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70   = pPg;.  }..  p
63e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50  List->pLast = pP
63f0: 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74 2d  g;.  if( !pList-
6400: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 26 26  >pFirstSynced &&
6410: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
6420: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
6430: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
6440: 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
6450: 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d   Remove pPg from
6460: 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
6470: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
6480: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
6490: 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72   pList..**.** Ar
64a0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
64b0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
64c0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
64d0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65 70   pPg->gfree, dep
64e0: 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68  ending .** on wh
64f0: 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69  ether pPg is bei
6500: 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
6510: 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f  pager-specific o
6520: 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73  r global LRU lis
6530: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6540: 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61 67  d listRemove(Pag
6550: 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74  erLruList *pList
6560: 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a  , PagerLruLink *
6570: 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50  pLink, PgHdr *pP
6580: 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  g){.  int iOff =
6590: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
65a0: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23   (char *)pPg;..#
65b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
65c0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
65d0: 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70  EMENT.  assert(p
65e0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65  Link==&pPg->free
65f0: 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d   || pLink==&pPg-
6600: 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72  >gfree);.  asser
6610: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67  t(pLink==&pPg->g
6620: 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26  free || pList!=&
6630: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6640: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  st);.#endif..  i
6650: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6660: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c 69  First ){.    pLi
6670: 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69  st->pFirst = pLi
6680: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  nk->pNext;.  }. 
6690: 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d   if( pPg==pList-
66a0: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 4c  >pLast ){.    pL
66b0: 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69  ist->pLast = pLi
66c0: 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  nk->pPrev;.  }. 
66d0: 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65   if( pLink->pPre
66e0: 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72  v ){.    PagerLr
66f0: 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b  uLink *pPrevLink
6700: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
6710: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e   *)(&((u8 *)pLin
6720: 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d 29  k->pPrev)[iOff])
6730: 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d  ;.    pPrevLink-
6740: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6750: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
6760: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b   pLink->pNext ){
6770: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
6780: 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28  k *pNextLink = (
6790: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
67a0: 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70  &((u8 *)pLink->p
67b0: 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Next)[iOff]);.  
67c0: 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72    pNextLink->pPr
67d0: 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  ev = pLink->pPre
67e0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  v;.  }.  if( pPg
67f0: 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53  ==pList->pFirstS
6800: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
6810: 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70  dr *p = pLink->p
6820: 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  Next;.    while(
6830: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
6840: 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  c ){.      Pager
6850: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50  LruLink *pL = (P
6860: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
6870: 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29  ((u8 *)p)[iOff])
6880: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e  ;.      p = pL->
6890: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
68a0: 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79   pList->pFirstSy
68b0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
68c0: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
68d0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30  pLink->pPrev = 0
68e0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20  ;.}../* .** Add 
68f0: 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
6900: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6910: 65 73 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  es for the pager
6920: 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d  . If .** memory-
6930: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6940: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64 20  abled, also add 
6950: 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
6960: 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20  global .** list 
6970: 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a  of free pages..*
6980: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72  /.static void lr
6990: 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20 2a  uListAdd(PgHdr *
69a0: 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64 28  pPg){.  listAdd(
69b0: 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72  &pPg->pPager->lr
69c0: 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70  u, &pPg->free, p
69d0: 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
69e0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
69f0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
6a00: 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  ( !pPg->pPager->
6a10: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
6a20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6a30: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6a40: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6a50: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6a60: 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c      listAdd(&sql
6a70: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6a80: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6a90: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6aa0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6ab0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6ac0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6ad0: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6ae0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6af0: 52 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20  Remove page pPg 
6b00: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
6b10: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6b20: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70  the associated p
6b30: 61 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f  ager..** If memo
6b40: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6b50: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72   enabled, also r
6b60: 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74  emove pPg from t
6b70: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a  he global list.*
6b80: 2a 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e  * of free pages.
6b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ba0: 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67  lruListRemove(Pg
6bb0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6bc0: 74 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50  tRemove(&pPg->pP
6bd0: 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d  ager->lru, &pPg-
6be0: 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66  >free, pPg);.#if
6bf0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6c00: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6c10: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  ENT.  if( !pPg->
6c20: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6c40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6c50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6c60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6c70: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74  _LRU));.    list
6c80: 52 65 6d 6f 76 65 28 26 73 71 6c 69 74 65 33 4c  Remove(&sqlite3L
6c90: 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67  ruPageList, &pPg
6ca0: 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20  ->gfree, pPg);. 
6cb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6cc0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
6cd0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6ce0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6cf0: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
6d00: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
6d10: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6d20: 65 64 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  ed just after th
6d30: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
6d40: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
6d50: 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67  .** from all pag
6d60: 65 73 20 6d 61 6e 61 67 65 64 20 62 79 20 70 50  es managed by pP
6d70: 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20 62 65  ager (usually be
6d80: 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
6d90: 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75  l file.** has ju
6da0: 73 74 20 62 65 65 6e 20 73 79 6e 63 65 64 29 2e  st been synced).
6db0: 20 49 74 20 75 70 64 61 74 65 73 20 74 68 65 20   It updates the 
6dc0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6dd0: 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c  stSynced variabl
6de0: 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d  e.** and, if mem
6df0: 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
6e00: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 73  s enabled, the s
6e10: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6e20: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 0a 2a  t.pFirstSynced.*
6e30: 2a 20 76 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e  * variable also.
6e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6e50: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
6e60: 79 6e 63 65 64 28 50 61 67 65 72 20 2a 70 50 61  ynced(Pager *pPa
6e70: 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ger){.  pPager->
6e80: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6e90: 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70   = pPager->lru.p
6ea0: 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51  First;.#ifdef SQ
6eb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6ec0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6ed0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
6ee0: 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  Db ){.    PgHdr 
6ef0: 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  *p;.    sqlite3_
6f00: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
6f10: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6f20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6f30: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66  TIC_LRU));.    f
6f40: 6f 72 28 70 3d 73 71 6c 69 74 65 33 4c 72 75 50  or(p=sqlite3LruP
6f50: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 20  ageList.pFirst; 
6f60: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
6f70: 3b 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65  ; p=p->gfree.pNe
6f80: 78 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xt);.    assert(
6f90: 70 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  p==pPager->lru.p
6fa0: 46 69 72 73 74 53 79 6e 63 65 64 20 7c 7c 20 70  FirstSynced || p
6fb0: 3d 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  ==sqlite3LruPage
6fc0: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
6fd0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4c  d);.    sqlite3L
6fe0: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6ff0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
7000: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7010: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
7020: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
7030: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
7040: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
7050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7060: 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67  rue if page *pPg
7070: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7080: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
7090: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f   statement.** jo
70a0: 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d  urnal (or statem
70b0: 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73  ent snapshot has
70c0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
70d0: 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a  f *pPg is part.*
70e0: 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  * of an in-memor
70f0: 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  y database)..*/.
7100: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
7110: 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72  nStatement(PgHdr
7120: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
7130: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
7140: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d  Pager;.  if( MEM
7150: 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  DB ){.    return
7160: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7170: 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53  Pg, pPager)->inS
7180: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7190: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
71a0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
71b0: 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
71c0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
71d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
71e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
71f0: 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  r hash table to 
7200: 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20  N.  N must be a 
7210: 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e  power.** of two.
7220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7230: 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
7240: 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70  h_table(Pager *p
7250: 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20  Pager, int N){. 
7260: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20   PgHdr **aHash, 
7270: 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20  *pPg;.  assert( 
7280: 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29  N>0 && (N&(N-1))
7290: 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ==0 );.#ifdef SQ
72a0: 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54  LITE_MALLOC_SOFT
72b0: 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73  _LIMIT.  if( N*s
72c0: 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e  izeof(aHash[0])>
72d0: 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f  SQLITE_MALLOC_SO
72e0: 46 54 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  FT_LIMIT ){.    
72f0: 4e 20 3d 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  N = SQLITE_MALLO
7300: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a  C_SOFT_LIMIT/siz
7310: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20  eof(aHash[0]);. 
7320: 20 7d 0a 20 20 69 66 28 20 4e 3d 3d 70 50 61 67   }.  if( N==pPag
7330: 65 72 2d 3e 6e 48 61 73 68 20 29 20 72 65 74 75  er->nHash ) retu
7340: 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67  rn;.#endif.  pag
7350: 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
7360: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7370: 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69 74 65  Hash!=0 ) sqlite
7380: 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
7390: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
73a0: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
73b0: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
73c0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
73d0: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
73e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
73f0: 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69  >aHash!=0 ) sqli
7400: 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67  te3FaultEndBenig
7410: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
7420: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
7430: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
7440: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
7450: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
7460: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
7470: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
7480: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
7490: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
74a0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
74b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
74c0: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
74d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
74e0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
74f0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
7500: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7510: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7520: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
7530: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
7540: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
7550: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
7560: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
7570: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
7580: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
7590: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
75a0: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
75b0: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
75c0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
75d0: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
75e0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
75f0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
7600: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
7610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
7620: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
7630: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
7640: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7650: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
7660: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
7670: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7680: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
7690: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
76a0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
76b0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
76c0: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
76d0: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
76e0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
76f0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7700: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
7710: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
7720: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
7730: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
7740: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
7750: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
7760: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
7770: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
7780: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7790: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
77a0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
77b0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
77c0: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
77d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77e0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
77f0: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
7800: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
7810: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
7820: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
7830: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
7840: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
7850: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
7860: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
7870: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
7880: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
7890: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
78a0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
78b0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
78c0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
78d0: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
78e0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
78f0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
7900: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
7910: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7930: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
7940: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
7950: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
7960: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
7970: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
7980: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
7990: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
79a0: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
79b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
79c0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
79d0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
79e0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
79f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
7a00: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
7a10: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
7a20: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
7a30: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
7a40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7a50: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
7a60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7a70: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
7a80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7a90: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
7aa0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7ab0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
7ac0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
7ad0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
7ae0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
7af0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7b00: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
7b10: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
7b20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
7b30: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7b40: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
7b50: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
7b60: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
7b70: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
7b80: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
7b90: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
7ba0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
7bb0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
7bc0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
7bd0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
7be0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
7bf0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
7c00: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
7c10: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
7c20: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
7c30: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
7c40: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7c50: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
7c60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7c70: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
7c80: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
7c90: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
7ca0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
7cb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7cc0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
7ce0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
7cf0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
7d00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7d10: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
7d20: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
7d30: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
7d40: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
7d50: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
7d60: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
7d70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7d80: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
7d90: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
7da0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
7db0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
7dc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7dd0: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
7de0: 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73  ctor = sqlite3Os
7df0: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
7e00: 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
7e10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
7e20: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
7e30: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
7e40: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
7e50: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7e60: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
7e70: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
7e80: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
7e90: 73 20 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45  s || (dc&(SQLITE
7ea0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e  _IOCAP_ATOMIC|(n
7eb0: 50 61 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74  Page>>8))&&nSect
7ec0: 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20  or<=nPage) ){.  
7ed0: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
7ee0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7ef0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
7f00: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7f10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7f20: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
7f30: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
7f40: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
7f50: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
7f60: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
7f70: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
7f80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
7f90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7fa0: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
7fb0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
7fc0: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
7fd0: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
7fe0: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
7ff0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
8000: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8010: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
8020: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8030: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
8040: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
8050: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8060: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
8070: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
8080: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
8090: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
80a0: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
80b0: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
80c0: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
80d0: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
80e0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
80f0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
8100: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
8110: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
8120: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
8130: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
8140: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
8150: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
8160: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
8170: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
8180: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
8190: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
81a0: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
81b0: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
81c0: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
81d0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
81e0: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
81f0: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
8200: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
8210: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
8220: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
8230: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
8240: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
8250: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
8260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8270: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8280: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
8290: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
82a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
82b0: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
82c0: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
82d0: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
82e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
82f0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
8300: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
8310: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
8320: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
8330: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
8340: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
8350: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
8360: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
8370: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
8380: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
8390: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
83a0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
83b0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
83c0: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
83d0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
83e0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 70  AGER_UNLOCK && p
83f0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
8400: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
8410: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
8420: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
8430: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
8440: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
8450: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
8460: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
8470: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
8480: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
8490: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
84a0: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
84b0: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
84c0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
84d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
84e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
84f0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8500: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
8510: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
8520: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
8530: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
8540: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
8550: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
8560: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
8570: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
8580: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
8590: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
85a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
85b0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
85c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
85d0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
85e0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
85f0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
8600: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8610: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
8620: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
8630: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
8640: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
8650: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
8660: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
8670: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
8680: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
8690: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
86a0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
86b0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
86c0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
86d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
8700: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
8710: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
8720: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
8730: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
8740: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
8750: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
8760: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8770: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
8780: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
8790: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
87a0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
87b0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
87c0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
87d0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
87e0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
87f0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
8800: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
8810: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
8820: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
8830: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
8840: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8850: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8860: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
8870: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
8880: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
8890: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
88a0: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
88b0: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
88c0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
88d0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
88e0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
88f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
8900: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
8910: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
8920: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
8930: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
8940: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8950: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
8960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
8970: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
8980: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
8990: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
89a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
89b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
89c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
89d0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
89e0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
89f0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
8a00: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
8a10: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
8a20: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
8a30: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8a40: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8a50: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8a60: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
8a70: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
8a80: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
8a90: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
8aa0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
8ab0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8ac0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8ad0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ae0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
8af0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
8b00: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
8b10: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
8b20: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
8b30: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8b40: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8b50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8b60: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
8b70: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
8b80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
8b90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8ba0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
8bb0: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
8bc0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8bd0: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8be0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8bf0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8c00: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8c10: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8c20: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8c30: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8c40: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8c50: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8c60: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8c70: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8c80: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8c90: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8ca0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8cb0: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8cc0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8cd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8ce0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8cf0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8d00: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8d10: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8d20: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d30: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8d40: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8d50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8d60: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8d70: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8d80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d90: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8da0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8db0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8dc0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8dd0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8de0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8df0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8e00: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8e10: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8e20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8e30: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8e40: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8e50: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8e60: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8e70: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8e80: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8e90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8eb0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8ec0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8ed0: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8ee0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8ef0: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8f00: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8f10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8f30: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8f40: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8f50: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8f60: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8f70: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8f80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8f90: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
8fa0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
8fb0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8fc0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
8fd0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
8fe0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
8ff0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
9000: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
9010: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
9020: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
9030: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
9040: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
9050: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
9060: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
9070: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
9080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9090: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
90a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
90b0: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
90c0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
90d0: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
90e0: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
90f0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
9100: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
9110: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
9120: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
9130: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
9140: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
9150: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
9160: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
9170: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
9180: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
9190: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
9220: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9230: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
9240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9250: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
9260: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9270: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
9280: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
9290: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
92a0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
92b0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
92c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
92d0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
92e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
92f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9300: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
9310: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
9320: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
9330: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
9340: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
9350: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9360: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
9370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9380: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
9390: 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f  ** Write zeros o
93a0: 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f  ver the header o
93b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
93c0: 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  le.  This has th
93d0: 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69  e.** effect of i
93e0: 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
93f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
9400: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a   committing the.
9410: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ** transaction..
9420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
9430: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
9440: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
9450: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
9460: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9470: 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  K;.  static cons
9480: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
9490: 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  8];..  if( pPage
94a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
94b0: 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20  .    i64 iLimit 
94c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
94d0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20  lSizeLimit;..   
94e0: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
94f0: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
9500: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
9510: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
9520: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
9530: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
9540: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
9550: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
9560: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9570: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9580: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
9590: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
95a0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
95b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
95c0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
95d0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
95e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
95f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
9600: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
9610: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
9620: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
9630: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
9640: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
9650: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
9660: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
9670: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
9680: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
9690: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
96a0: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
96b0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
96c0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
96d0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
96e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
96f0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
9700: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
9710: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
9720: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
9730: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
9740: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
9750: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
9760: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
9770: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
9780: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
9790: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
97a0: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
97b0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
97c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
97d0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
97e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
97f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
9800: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
9810: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
9820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
9830: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9840: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
9850: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9870: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9880: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9890: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
98a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
98b0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
98c0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
98d0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
98e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
98f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9900: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9910: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
9920: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
9930: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9940: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
9950: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
9960: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
9970: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
9980: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9990: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
99a0: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
99b0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
99c0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
99d0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
99e0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
99f0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9a00: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9a10: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
9a20: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
9a30: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
9a40: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
9a50: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
9a60: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
9a70: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
9a80: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
9a90: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
9aa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
9ab0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
9ac0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
9ad0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
9ae0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9af0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
9b00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9b10: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
9b20: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
9b30: 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  e;.  int nHeader
9b40: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
9b50: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ize;.  int nWrit
9b60: 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  e;..  if( nHeade
9b70: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
9b80: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9b90: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
9ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9bb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
9bc0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
9bd0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
9be0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
9bf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c00: 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f  f;.  }..  seekJo
9c10: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
9c20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9c30: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
9c40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9c50: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
9c60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
9c70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9c80: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
9c90: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
9ca0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
9cb0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
9cc0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
9cd0: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
9ce0: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
9cf0: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
9d00: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
9d10: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
9d20: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
9d30: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
9d40: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
9d50: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
9d60: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
9d70: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
9d80: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
9d90: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
9da0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
9db0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
9dc0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
9dd0: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
9de0: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
9df0: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
9e00: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
9e10: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
9e20: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
9e30: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9e40: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
9e50: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
9e60: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
9e70: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
9e80: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9e90: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
9ea0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
9eb0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
9ec0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
9ed0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9ee0: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
9ef0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
9f00: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
9f10: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
9f20: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
9f30: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
9f40: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
9f50: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
9f60: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
9f70: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
9f80: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
9f90: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
9fa0: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
9fb0: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
9fc0: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
9fd0: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
9fe0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
9ff0: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
a000: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
a010: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
a020: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
a030: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
a040: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
a050: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
a060: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
a070: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
a080: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
a090: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
a0a0: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
a0b0: 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28  noSync) .   || (
a0c0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
a0d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
a0e0: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
a0f0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
a100: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  END) .  ){.    p
a110: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a120: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a130: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
a140: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
a150: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
a160: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
a170: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
a180: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
a190: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
a1a0: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
a1b0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
a1c0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
a1d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a1e0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
a1f0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
a200: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
a210: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
a220: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
a230: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
a240: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
a250: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
a260: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a270: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a280: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
a290: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
a2a0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
a2b0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
a2c0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
a2d0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a2e0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a2f0: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
a300: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
a310: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
a320: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29  >journalHdr==0 )
a330: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
a340: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75  e size */.    pu
a350: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a360: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a370: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
a380: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a390: 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65   }..  for(nWrite
a3a0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
a3b0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
a3c0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a3d0: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
a3e0: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
a3f0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
a400: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
a410: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
a420: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
a430: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a440: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a450: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
a460: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
a470: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67  alOff);.    pPag
a480: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a490: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
a4a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a4b0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
a4c0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
a4d0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
a4e0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
a4f0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
a500: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
a510: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
a520: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
a530: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
a540: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
a550: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
a560: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
a570: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
a580: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
a590: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
a5a0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
a5b0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
a5c0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
a5d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
a5e0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
a5f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
a600: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
a610: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
a620: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
a630: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
a640: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
a650: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
a660: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
a670: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
a680: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
a690: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
a6a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
a6b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a6c0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
a6d0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
a6e0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
a6f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
a700: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a710: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
a720: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
a730: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
a740: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
a750: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
a760: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
a770: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a780: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
a790: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a7a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
a7b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a7c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a7d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
a7e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
a7f0: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
a800: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
a810: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
a820: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
a830: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
a840: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
a850: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
a860: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
a870: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f  r */.  i64 jrnlO
a880: 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53  ff;.  int iPageS
a890: 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  ize;..  seekJour
a8a0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
a8b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a8c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
a8d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a8e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
a8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a900: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a  TE_DONE;.  }.  j
a910: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
a920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
a930: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a940: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
a950: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
a960: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
a970: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a980: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
a990: 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67  f += sizeof(aMag
a9a0: 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63  ic);..  if( memc
a9b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
a9c0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
a9d0: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
a9e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a9f0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
aa00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
aa10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
aa20: 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  Off, pNRec);.  i
aa30: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
aa40: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
aa50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
aa60: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70  d, jrnlOff+4, &p
aa70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
aa80: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
aa90: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
aaa0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
aab0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
aac0: 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  +8, pDbSize);.  
aad0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aae0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
aaf0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
ab00: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20  fd, jrnlOff+16, 
ab10: 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a  (u32 *)&iPageSiz
ab20: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
ab30: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69  LITE_OK .   && i
ab40: 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20  PageSize>=512 . 
ab50: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d    && iPageSize<=
ab60: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
ab70: 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50  SIZE .   && ((iP
ab80: 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
ab90: 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  Size)==0 .  ){. 
aba0: 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20     u16 pagesize 
abb0: 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  = iPageSize;.   
abc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
abd0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
abe0: 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29  ager, &pagesize)
abf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
ac00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
ac10: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
ac20: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
ac30: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
ac40: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
ac50: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
ac60: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
ac70: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
ac80: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
ac90: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
aca0: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
acb0: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
acc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
acd0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
ace0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
acf0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
ad00: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
ad10: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
ad20: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
ad30: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
ad40: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
ad50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
ad60: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
ad70: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32  >jfd, jrnlOff+12
ad80: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
ad90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
ada0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
adb0: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
adc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
add0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ade0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
adf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
ae00: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
ae10: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
ae20: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
ae30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ae40: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
ae50: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
ae60: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
ae70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ae80: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
ae90: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
aea0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
aeb0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
aec0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
aed0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
aee0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
aef0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
af00: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
af10: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
af20: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
af30: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
af40: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
af50: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
af60: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
af70: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
af80: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
af90: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
afa0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
afb0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
afc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
afd0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
afe0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
aff0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
b000: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
b010: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
b020: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
b030: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
b040: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
b050: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
b060: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
b070: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
b080: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
b090: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
b0a0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
b0b0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
b0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b0d0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
b0e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b0f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
b100: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
b110: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
b120: 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72  int i; .  i64 jr
b130: 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e  nlOff;.  i64 jrn
b140: 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73  lSize;.  u32 cks
b150: 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  um = 0;.  char z
b160: 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  Buf[sizeof(aJour
b170: 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a  nalMagic)+2*4];.
b180: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
b190: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
b1a0: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
b1b0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
b1c0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
b1d0: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
b1e0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
b1f0: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
b200: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
b210: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
b220: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
b230: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
b240: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
b250: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
b260: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
b270: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b280: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
b290: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
b2a0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
b2b0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
b2c0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
b2d0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
b2e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
b2f0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
b300: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
b310: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
b320: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
b330: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
b340: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b350: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
b360: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
b370: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
b380: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
b390: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
b3a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b3b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b3c0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
b3d0: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
b3e0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b3f0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
b400: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
b410: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b420: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b430: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
b440: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
b450: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
b460: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
b470: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
b480: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
b490: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
b4a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b4b0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
b4c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b4d0: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
b4e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b4f0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
b500: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73    jrnlOff += 8+s
b510: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b520: 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  gic);.  pPager->
b530: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
b540: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
b550: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b560: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
b570: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
b580: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
b590: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
b5a0: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
b5b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b5c0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b5d0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
b5e0: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
b5f0: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
b600: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
b610: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
b620: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
b630: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
b640: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
b650: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
b660: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
b670: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
b680: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
b690: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
b6a0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b6b0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
b6c0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
b6d0: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
b6e0: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
b6f0: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
b700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
b710: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
b720: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
b730: 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53  */ .  if( (rc==S
b740: 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20  QLITE_OK).   && 
b750: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b760: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b770: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
b790: 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f  & jrnlSize>jrnlO
b7a0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b7b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b7c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b7d0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  jrnlOff);.  }.  
b7e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b7f0: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
b800: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
b810: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
b820: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
b830: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
b840: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
b850: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
b860: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
b870: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
b880: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
b890: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
b8a0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
b8b0: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
b8c0: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
b8d0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
b8e0: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
b8f0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
b900: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
b910: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
b920: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
b930: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
b940: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b950: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
b960: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
b970: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
b980: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
b990: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b9a0: 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f  Pager;.  PgHisto
b9b0: 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
b9c0: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
b9d0: 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
b9e0: 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28  ( MEMDB );.  if(
b9f0: 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20   !pHist->inStmt 
ba00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ba10: 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Hist->pPrevStmt=
ba20: 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65  =0 && pHist->pNe
ba30: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  xtStmt==0 );.   
ba40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74   if( pPager->pSt
ba50: 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44  mt ){.      PGHD
ba60: 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72  R_TO_HIST(pPager
ba70: 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29  ->pStmt, pPager)
ba80: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
ba90: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69  g;.    }.    pHi
baa0: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
bab0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
bac0: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
bad0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73   = pPg;.    pHis
bae0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20  t->inStmt = 1;. 
baf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   }.}../*.** Find
bb00: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
bb10: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
bb20: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
bb30: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
bb40: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
bb50: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
bb60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
bb70: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
bb80: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
bb90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
bba0: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
bbb0: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
bbc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
bbd0: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
bbe0: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
bbf0: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
bc00: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
bc10: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
bc20: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
bc30: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
bc40: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   p;.}../*.** Cle
bc50: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
bc60: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
bc70: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
bc80: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
bc90: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
bca0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
bcb0: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
bcc0: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
bcd0: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
bce0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
bcf0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
bd00: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
bd10: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
bd20: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
bd30: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
bd40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bd50: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
bd60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
bd70: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
bd80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bd90: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
bda0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
bdb0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
bdc0: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
bdd0: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
bde0: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
bdf0: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
be00: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
be10: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
be20: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
be30: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
be40: 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74  All;.    lruList
be50: 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20  Remove(pPg);.   
be60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
be70: 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  g->pData);.    s
be80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
be90: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
bea0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
beb0: 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t==0);.  assert(
bec0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
bed0: 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20  stSynced==0);.  
bee0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
bef0: 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20  ru.pLast==0);.  
bf00: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
bf10: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
bf20: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
bf30: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70  >pDirty = 0;.  p
bf40: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
bf50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
bf60: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
bf70: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
bf80: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
bf90: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
bfa0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
bfb0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
bfc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bfd0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
bfe0: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
bff0: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
c000: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
c010: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
c020: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
c030: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
c040: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
c050: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
c060: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
c070: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
c080: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
c090: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
c0a0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
c0b0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
c0c0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
c0d0: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
c0e0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
c0f0: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
c100: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
c110: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
c120: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
c130: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
c140: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
c150: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c160: 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
c170: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
c180: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
c190: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
c1a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c1b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c1c0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61   = rc;.      pPa
c1d0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c1e0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
c1f0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
c200: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20  pPager))..      
c210: 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20  /* Always close 
c220: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c230: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
c240: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
c250: 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  ..      ** Other
c260: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
c270: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
c280: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
c290: 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
c2a0: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
c2b0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
c2c0: 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  us..      */.   
c2d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c2e0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
c2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
c300: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
c310: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
c320: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c330: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
c340: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c350: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
c360: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 50  nal);.        pP
c370: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
c390: 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72       /* If Pager
c3a0: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
c3b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c3c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c3d0: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20   cannot be.     
c3e0: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
c3f0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c400: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c410: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
c420: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  f the.      ** c
c430: 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
c440: 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72  arded and the er
c450: 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20  ror code safely 
c460: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
c470: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
c480: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
c490: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c4a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65  QLITE_OK ) pPage
c4b0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
c4c0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
c4d0: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
c4e0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
c4f0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c500: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
c510: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c520: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
c530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
c540: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c550: 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
c560: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c570: 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
c580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c590: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
c5a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
c5b0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
c5c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c5d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c5e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c5f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c600: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
c610: 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
c620: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  open = 0;.      
c630: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
c640: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
c650: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
c660: 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65   !MEMDB || pPage
c670: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
c680: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c690: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
c6a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
c6b0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
c6c0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
c6d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c6e0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
c6f0: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
c700: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
c710: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
c720: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c730: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
c740: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
c750: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
c760: 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20  ate, .** do not 
c770: 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c  attempt the roll
c780: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
c790: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
c7a0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
c7b0: 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61 73 73 65  r *p){.  /* asse
c7c0: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
c7d0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
c7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
c7f0: 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28 20 70 2d  0 ); */.  if( p-
c800: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
c810: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
c820: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
c830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61  ){.    sqlite3Fa
c840: 75 6c 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 2d  ultBeginBenign(-
c850: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1);.    sqlite3P
c860: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
c870: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61 75 6c  .    sqlite3Faul
c880: 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31 29 3b 0a  tEndBenign(-1);.
c890: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
c8a0: 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20 20 61  ck(p);.#if 0.  a
c8b0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
c8c0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
c8d0: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
c8e0: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
c8f0: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
c900: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
c910: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
c920: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
c930: 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64 69 66  veMode );.#endif
c940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c950: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
c960: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
c970: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
c980: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
c990: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
c9a0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
c9b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c9c0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
c9d0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
c9e0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
c9f0: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
ca00: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
ca10: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
ca20: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
ca30: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
ca40: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
ca50: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
ca60: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
ca70: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
ca80: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
ca90: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
caa0: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
cab0: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
cac0: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
cad0: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
cae0: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
caf0: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
cb00: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
cb10: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
cb20: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
cb30: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
cb40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
cb50: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
cb60: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
cb70: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
cb80: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
cb90: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
cba0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
cbb0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
cbc0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
cbd0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
cbe0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
cbf0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
cc00: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
cc10: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
cc20: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
cc30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
cc40: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
cc50: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
cc60: 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
cc70: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
cc80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cc90: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
cca0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ccb0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
ccc0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ccd0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
cce0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd00: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
cd10: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
cd20: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
cd30: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
cd40: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cd50: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
cd60: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
cd70: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
cd80: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
cd90: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
cda0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cdb0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
cdc0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cdd0: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
cde0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cdf0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ce00: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
ce10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
ce20: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
ce30: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
ce40: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
ce50: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
ce60: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ce70: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
ce80: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ce90: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
cea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ceb0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cec0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
ced0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cee0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
cef0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cf00: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
cf10: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
cf20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cf30: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
cf40: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
cf50: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
cf60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
cf70: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
cf80: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
cf90: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
cfa0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
cfb0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
cfc0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
cfd0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
cfe0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
cff0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
d000: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
d010: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
d020: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
d030: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
d040: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
d050: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
d060: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
d070: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
d080: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
d090: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
d0a0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
d0b0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
d0c0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
d0d0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
d0e0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
d0f0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
d100: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
d110: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
d120: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
d130: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
d140: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
d150: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
d160: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
d170: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d180: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
d190: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
d1a0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
d1b0: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
d1c0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
d1d0: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
d1e0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
d1f0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
d200: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
d210: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d220: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c  eedSync = 0;.  l
d230: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
d240: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
d250: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
d260: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64   -1;.  pPager->d
d270: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
d280: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
d290: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
d2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
d2b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
d2c0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
d2d0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
d2e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
d2f0: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
d300: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
d310: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d320: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d330: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
d340: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
d350: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
d360: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
d370: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
d380: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
d390: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
d3a0: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
d3b0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
d3c0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
d3d0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
d3e0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
d3f0: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
d400: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
d410: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
d420: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
d430: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
d440: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d450: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d460: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d470: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
d480: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
d490: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
d4a0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
d4b0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
d4c0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
d4d0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
d4e0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
d4f0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
d500: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
d510: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
d520: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
d530: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
d540: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
d550: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
d560: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
d570: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
d580: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
d590: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
d5a0: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
d5b0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
d5c0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
d5d0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
d5e0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
d5f0: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
d600: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
d610: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
d620: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
d630: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
d640: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
d650: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
d660: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
d670: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
d680: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
d690: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
d6a0: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
d6b0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
d6c0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
d6d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
d6e0: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
d6f0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
d700: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
d710: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
d720: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
d730: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
d740: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
d750: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
d760: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
d770: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
d780: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
d790: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
d7a0: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
d7b0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
d7c0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d7d0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
d7e0: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
d7f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
d800: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
d810: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
d820: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
d830: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
d840: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
d850: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
d860: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
d870: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
d880: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d890: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
d8a0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
d8b0: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
d8c0: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
d8d0: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
d8e0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
d8f0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
d900: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
d910: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d920: 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73  *jfd,.  i64 offs
d930: 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73  et,.  int useCks
d940: 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  um.){.  int rc;.
d950: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
d980: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
d990: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
d9c0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
d9d0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
d9e0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da00: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
da10: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
da20: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
da30: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
da40: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
da50: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
da60: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
da70: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
da80: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
da90: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
daa0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
dab0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
dac0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
dad0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
dae0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
daf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
db00: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
db10: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
db20: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
db30: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
db40: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
db50: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
db60: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
db70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
db80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
db90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
dba0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
dbb0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
dbc0: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
dbd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
dbe0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
dbf0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
dc00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
dc10: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
dc20: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
dc30: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
dc40: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
dc50: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
dc60: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
dc70: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
dc80: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
dc90: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
dca0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
dcb0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
dcc0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
dcd0: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
dce0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
dcf0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
dd00: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
dd10: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
dd20: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
dd30: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
dd40: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
dd50: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
dd60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
dd70: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
dd80: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
dd90: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
dda0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
ddb0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
ddc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ddd0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
dde0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
ddf0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
de00: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
de10: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
de20: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
de30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
de40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
de50: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
de60: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
de70: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
de80: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
de90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
dea0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
deb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
dec0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
ded0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
dee0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
def0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
df00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
df10: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
df20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
df30: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
df40: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
df50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
df60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
df70: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
df80: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
df90: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
dfa0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
dfb0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
dfc0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
dfd0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
dfe0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
dff0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e000: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e010: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e020: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e030: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e040: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e050: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e060: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e070: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e080: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e090: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e0a0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e0b0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e0c0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e0d0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e0e0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e0f0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e100: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e110: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e120: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e130: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e140: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e150: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e160: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e170: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e180: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
e190: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
e1a0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
e1b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
e1c0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
e1d0: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
e1e0: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
e1f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e200: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
e210: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
e220: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
e230: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
e240: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
e250: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e260: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e270: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
e280: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
e290: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
e2a0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
e2b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
e2c0: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
e2d0: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
e2e0: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
e2f0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
e300: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
e310: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
e320: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
e330: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
e340: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
e350: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
e360: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
e370: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
e380: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
e390: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
e3a0: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
e3b0: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
e3c0: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
e3d0: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
e3e0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e3f0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
e400: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
e410: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
e420: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
e430: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
e440: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
e450: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
e460: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
e470: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
e480: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
e490: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
e4a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
e4b0: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
e4c0: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
e4d0: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
e4e0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
e4f0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
e500: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
e510: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
e520: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
e530: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
e540: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
e550: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
e560: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
e570: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
e580: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
e590: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
e5a0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
e5b0: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
e5c0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
e5d0: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
e5e0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
e5f0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
e600: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
e610: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
e620: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
e630: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
e640: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
e650: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
e660: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
e670: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
e680: 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE4("PLAYBACK %d
e690: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
e6a0: 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
e6b0: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
e6c0: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
e6d0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
e6e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
e6f0: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50  Data));.  if( pP
e700: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e710: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
e720: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
e730: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20 20  needSync==0).   
e740: 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
e750: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
e760: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
e770: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
e780: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
e790: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e7a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e7b0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
e7c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
e7d0: 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  fset);.    if( p
e7e0: 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65  Pg ){.      make
e7f0: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
e800: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  }.  }.  if( pPg 
e810: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
e820: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
e830: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
e840: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
e850: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
e860: 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
e870: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
e880: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
e890: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
e8a0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
e8b0: 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
e8c0: 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
e8d0: 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
e8e0: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
e8f0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
e900: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
e910: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
e920: 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
e930: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
e940: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
e950: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
e960: 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73  pData;.    /* as
e970: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
e980: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
e990: 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61  =1 ); */.    pDa
e9a0: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
e9b0: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
e9c0: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
e9d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
e9e0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
e9f0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
ea00: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ea10: 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70  xReiniter(pPg, p
ea20: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ea30: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
ea40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
ea50: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
ea60: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
ea70: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
ea80: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
ea90: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
eaa0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
eab0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
eac0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
ead0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
eae0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
eaf0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
eb00: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
eb10: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
eb20: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
eb30: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
eb40: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
eb50: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
eb60: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
eb70: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
eb80: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
eb90: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
eba0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
ebb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
ebc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
ebd0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
ebe0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
ebf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ec00: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
ec10: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
ec20: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
ec30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ec40: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
ec50: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
ec60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ec70: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
ec80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
ec90: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
eca0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
ecb0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
ecc0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
ecd0: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
ece0: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
ecf0: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
ed00: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
ed10: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
ed20: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
ed30: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ed40: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
ed50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ed60: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
ed70: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
ed80: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
ed90: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
eda0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
edb0: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
edc0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
edd0: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
ede0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
edf0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
ee00: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
ee10: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
ee20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
ee30: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
ee40: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
ee50: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
ee60: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
ee70: 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
ee80: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
ee90: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
eea0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
eeb0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
eec0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
eed0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
eee0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
eef0: 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74  pMaster;.  sqlit
ef00: 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
ef10: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  l;.  char *zMast
ef20: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
ef30: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
ef40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ef50: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
ef60: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
ef70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
ef80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ef90: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
efa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
efb0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
efc0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
efd0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
efe0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
eff0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
f000: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
f010: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
f020: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d  rence..  */.  pM
f030: 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
f040: 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  _file *)sqlite3_
f050: 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f  malloc(pVfs->szO
f060: 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
f070: 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
f080: 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
f090: 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
f0a0: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
f0b0: 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
f0c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f0d0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
f0e0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
f0f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f100: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
f110: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
f120: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f130: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
f140: 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
f150: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
f160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f170: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
f180: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
f190: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  er_open = 1;..  
f1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
f1b0: 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
f1c0: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
f1d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f1e0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
f1f0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
f200: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
f210: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
f220: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
f230: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
f240: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
f250: 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72  sterPtr = pPager
f260: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
f270: 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
f280: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
f290: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f2a0: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
f2b0: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
f2c0: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
f2d0: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
f2e0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
f2f0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
f300: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
f310: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
f320: 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  3_malloc(nMaster
f330: 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
f340: 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
f350: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
f360: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f370: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f380: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f390: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
f3a0: 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
f3b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
f3c0: 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
f3d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f3e0: 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
f3f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
f400: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
f410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f420: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f430: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f440: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
f450: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
f460: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
f470: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
f480: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
f490: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
f4a0: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
f4b0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
f4c0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
f4d0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
f4e0: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
f4f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f500: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f510: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f520: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
f530: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
f550: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
f560: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
f570: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f580: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
f590: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
f5a0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
f5b0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
f5c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
f5d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
f5e0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
f5f0: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
f600: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
f610: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f620: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
f630: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f640: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f650: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
f660: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
f670: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f680: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f690: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
f6a0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
f6b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f6c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f6d0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f6e0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f6f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
f700: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
f710: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
f720: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
f730: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
f740: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
f750: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
f760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f780: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f790: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
f7a0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
f7b0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
f7c0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
f7d0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
f7e0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
f7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
f800: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
f810: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f830: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
f840: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
f850: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
f870: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
f880: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
f890: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
f8a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
f8b0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f8c0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
f8d0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
f8e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f8f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f900: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
f910: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
f920: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
f930: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f940: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
f950: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
f960: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
f970: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
f980: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
f990: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
f9a0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
f9b0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
f9c0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
f9d0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
f9e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
f9f0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
fa00: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
fa10: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
fa20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
fa30: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
fa40: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
fa50: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
fa60: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
fa70: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
fa80: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
fa90: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
faa0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
fab0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
fac0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
fad0: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
fae0: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
faf0: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
fb00: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
fb10: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
fb20: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
fb30: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
fb40: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
fb50: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
fb60: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
fb70: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
fb80: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
fb90: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
fba0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
fbb0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
fbc0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
fbd0: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
fbe0: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
fbf0: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
fc00: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
fc10: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
fc20: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
fc30: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
fc40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
fc50: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
fc60: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
fc70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fc80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
fc90: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
fca0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
fcb0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
fcc0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
fcd0: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
fce0: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
fcf0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fd00: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
fd10: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
fd20: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
fd30: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
fd40: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
fd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
fd60: 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
fd70: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
fd80: 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
fd90: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
fda0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fdb0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
fdc0: 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
fdd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fde0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fdf0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
fe00: 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
fe10: 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
fe20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
fe30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fe40: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
fe50: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
fe60: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
fe70: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
fe80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fe90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fea0: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
feb0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
fec0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
fed0: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
fee0: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
fef0: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
ff00: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
ff10: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
ff20: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
ff30: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
ff40: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
ff50: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
ff60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ff70: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
ff80: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
ff90: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
ffa0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
ffb0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
ffc0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
ffd0: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
ffe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
fff0: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
10000 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
10010 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
10020 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
10030 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
10040 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
10050 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
10060 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
10070 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
10080 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
10090 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
100a0 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
100b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
100c0 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
100d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
100e0 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
100f0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
10100 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
10110 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
10120 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
10130 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
10140 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
10150 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
10160 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
10170 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10180 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
10190 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
101a0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
101b0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
101c0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
101d0 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
101e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
101f0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10200 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
10210 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
10220 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
10230 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
10240 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
10250 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
10260 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
10270 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
10280 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
10290 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
102a0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
102b0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
102c0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
102d0 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
102e0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
102f0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
10300 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
10310 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
10320 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10330 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10340 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
10350 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
10360 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
10370 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
10380 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
10390 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
103a0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
103b0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
103c0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
103d0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
103e0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
103f0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
10400 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
10410 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
10420 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10430 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10440 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
10450 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
10460 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
10470 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
10480 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
10490 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
104a0 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
104b0 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
104c0 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
104d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
104e0 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
104f0 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
10500 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
10510 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
10520 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
10530 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
10540 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
10550 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
10560 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
10570 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
10580 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
10590 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
105a0 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
105b0 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
105c0 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
105d0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
105e0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
105f0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
10600 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
10610 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
10620 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
10630 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10640 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
10650 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
10660 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
10670 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
10680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
10690 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
106a0 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
106b0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
106c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
106d0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
106e0 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
106f0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
10700 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
10710 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
10720 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
10730 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
10740 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
10750 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
10760 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
10770 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
10780 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
10790 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
107a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
107b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
107c0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
107d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
107e0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
107f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
10800 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
10810 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
10820 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
10830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10840 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
10850 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
10860 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
10870 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
10880 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
10890 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
108a0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
108b0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
108c0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
108d0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
108e0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
108f0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
10900 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
10910 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
10920 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
10930 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
10940 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
10950 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
10960 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
10970 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
10980 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
10990 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
109a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
109b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
109c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
109d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
109e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
109f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
10a00 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
10a10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
10a20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
10a30 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
10a40 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
10a50 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
10a60 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
10a70 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
10a80 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
10a90 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
10aa0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
10ab0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
10ac0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
10ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
10ae0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
10af0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
10b00 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
10b10 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
10b20 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
10b30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10b40 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
10b50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10b60 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
10b70 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
10b80 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
10b90 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
10ba0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
10bb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
10bc0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
10bd0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
10be0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
10bf0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
10c00 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
10c10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10c20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
10c30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
10c40 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
10c50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
10c60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
10c70 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
10c80 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
10cc0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
10cd0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10ce0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10cf0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
10d00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
10d10 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10d20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10d30 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
10d40 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
10d50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10d60 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
10d70 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
10d80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10d90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
10da0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
10db0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10dc0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
10dd0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
10de0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
10df0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
10e00 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
10e10 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
10e20 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
10e30 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
10e40 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
10e50 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
10e60 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
10e70 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
10e80 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
10e90 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
10ea0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
10eb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10ec0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
10ed0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ee0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ef0 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
10f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
10f10 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
10f20 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
10f30 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10f40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10f50 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
10f60 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
10f70 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
10f80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
10f90 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
10fa0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
10fb0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
10fc0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
10fd0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
10fe0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
10ff0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
11000 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
11010 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
11020 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
11030 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
11040 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
11050 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11060 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
11070 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
11080 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
11090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
110a0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
110b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
110c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
110d0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
110e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
110f0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
11100 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
11110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
11120 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
11130 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11140 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
11150 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
11160 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
11170 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
11180 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
11190 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
111a0 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
111b0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
111c0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
111d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
111e0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
111f0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
11200 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
11210 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
11220 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
11230 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
11240 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
11250 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
11260 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
11270 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
11280 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
11290 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
112a0 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
112b0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
112c0 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
112d0 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
112e0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
112f0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
11300 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
11310 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
11320 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
11350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11360 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
11370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
11390 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
113a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
113b0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
113c0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
113d0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
113e0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
113f0 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
11400 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
11410 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
11420 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
11430 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
11440 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
11450 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
11460 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
11470 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
11480 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
11490 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
114a0 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
114b0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
114c0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
114d0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
114e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
114f0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
11500 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
11510 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
11520 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
11530 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
11540 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
11550 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
11560 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
11570 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
11580 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
11590 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
115a0 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
115b0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
115c0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
115d0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
115e0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
115f0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
11600 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
11610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
11620 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
11630 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
11640 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
11650 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
11660 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11670 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
11680 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
11690 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
116a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
116b0 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
116c0 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
116d0 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
116e0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
116f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
11700 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
11710 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
11720 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
11730 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11740 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
11750 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
11760 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
11770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11780 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
11790 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
117a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
117b0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
117c0 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
117d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
117e0 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
117f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
11800 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
11810 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
11820 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11830 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
11840 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11850 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
11860 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
11870 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
11880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
118a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
118b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
118c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
118d0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
118e0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
118f0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
11900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11910 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
11920 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
11930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
11940 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11950 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11960 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
11970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11980 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
11990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
119a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
119b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
119c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
119d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
119e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
119f0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
11a00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11a10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
11a30 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
11a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11a50 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
11a60 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
11a70 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
11a80 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
11a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11aa0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
11ab0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
11ac0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
11ad0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
11ae0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
11af0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
11b00 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
11b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11b30 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
11b40 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
11b50 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
11b60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
11b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
11b80 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a  ter[0] ){.    /*
11b90 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
11ba0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
11bb0 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
11bc0 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
11bd0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
11be0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
11bf0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
11c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
11c10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
11c20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
11c30 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
11c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
11c50 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
11c60 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
11c70 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
11c80 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
11c90 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
11ca0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
11cb0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
11cc0 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
11cd0 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
11ce0 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
11cf0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
11d00 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
11d10 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
11d20 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
11d30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11d40 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
11d50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
11d60 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
11d70 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
11d80 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
11d90 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11da0 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
11db0 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
11dc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
11dd0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
11de0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11df0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
11e00 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
11e10 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
11e20 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
11e30 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
11e40 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
11e50 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
11e60 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
11e70 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
11e80 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
11e90 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
11ea0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
11eb0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
11ec0 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
11ed0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
11ee0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
11ef0 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
11f00 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
11f10 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
11f20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11f30 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
11f40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11f50 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
11f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11f70 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
11f80 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
11f90 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
11fa0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
11fc0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
11fd0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11fe0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11ff0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
12000 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
12010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
12020 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
12030 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
12040 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
12050 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
12060 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
12070 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
12080 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12090 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
120a0 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
120b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
120c0 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
120d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
120e0 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
120f0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
12100 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
12110 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
12120 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
12130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
12140 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
12150 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
12160 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
12170 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
12180 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
12190 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
121a0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
121b0 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
121c0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
121d0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
121e0 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
121f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
12200 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
12210 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
12220 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
12230 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
12240 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
12250 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
12260 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
12270 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
12280 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12290 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
122a0 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
122b0 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
122c0 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
122d0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
122e0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
122f0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
12300 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
12310 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
12320 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
12330 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
12340 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
12350 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
12360 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
12370 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
12380 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
12390 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
123a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
123b0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  c; i++){.    i64
123c0 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70   offset = i*(4+p
123d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
123e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
123f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12400 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
12410 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
12420 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
12430 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12440 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
12450 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12460 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
12470 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
12480 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
12490 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
124a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
124b0 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
124c0 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
124d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
124e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
124f0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
12500 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
12510 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
12520 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
12530 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
12540 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
12550 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12560 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
12570 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
12580 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
12590 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
125a0 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
125b0 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
125c0 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
125d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
125e0 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
125f0 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
12600 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12610 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50  ction..  */.  pP
12620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12630 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
12640 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
12650 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
12660 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
12670 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
12680 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72  journalOff < hdr
12690 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Off ){.    rc = 
126a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
126b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
126c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
126d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
126e0 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
126f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12700 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12720 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
12730 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
12740 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12750 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
12760 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
12770 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12780 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
12790 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
127a0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
127b0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
127c0 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
127d0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
127e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
127f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12800 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12810 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
12820 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
12830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12840 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
12850 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
12860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12870 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
12880 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
12890 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
128a0 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
128b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
128c0 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
128d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
128e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
128f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
12900 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
12910 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
12920 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
12930 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12940 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12950 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
12960 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
12970 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
12980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12990 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
129a0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
129b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
129c0 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
129d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
129e0 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
129f0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
12a00 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
12a10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12a20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
12a30 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
12a40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
12a50 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
12a60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12a70 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
12a80 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
12a90 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12aa0 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
12ab0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
12ac0 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
12ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
12ae0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
12af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
12b00 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
12b10 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
12b20 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
12b30 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
12b40 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
12b50 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
12b60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
12b70 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
12b80 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
12b90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
12ba0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
12bb0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
12bc0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
12bd0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
12be0 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
12bf0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
12c00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12c10 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
12c20 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
12c30 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
12c40 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
12c50 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
12c60 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
12c70 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12c90 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
12ca0 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
12cb0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
12cc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12cd0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
12ce0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
12cf0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
12d00 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
12d10 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
12d20 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
12d30 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
12d40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
12d60 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
12d70 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
12d80 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
12d90 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12da0 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
12db0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12dc0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
12dd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
12de0 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
12df0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
12e00 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12e10 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
12e20 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
12e30 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
12e40 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
12e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12e60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
12e70 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
12e80 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
12e90 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
12ea0 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
12eb0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
12ec0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12ee0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
12ef0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
12f00 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
12f10 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
12f20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
12f30 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
12f40 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
12f50 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
12f60 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
12f70 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
12f80 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
12f90 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
12fa0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
12fb0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
12fc0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
12fd0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
12fe0 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
12ff0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
13000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13010 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
13020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
13030 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
13040 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13050 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
13060 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
13070 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
13080 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
13090 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
130a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
130b0 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
130c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
130d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
130e0 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66  _flags = (full_f
130f0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
13100 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
13110 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
13120 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
13130 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
13140 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
13150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
13160 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
13170 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
13180 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
13190 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
131a0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
131b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
131c0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
131d0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
131e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
131f0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
13200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13210 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
13220 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
13230 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
13240 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
13250 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
13260 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
13270 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
13280 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
13290 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
132a0 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
132b0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
132c0 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
132d0 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
132e0 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
132f0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
13300 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
13310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13320 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13330 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
13340 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
13350 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
13360 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
13370 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
13380 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
13390 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
133a0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
133b0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
133c0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
133d0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
133e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
133f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
13400 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
13410 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
13420 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
13430 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
13440 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
13450 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
13460 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
13470 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
13480 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
13490 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
134a0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
134b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
134c0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
134d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
134e0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
134f0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
13500 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
13510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
13520 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
13530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
13540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
13550 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
13560 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
13570 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
13580 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
13590 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
135a0 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
135b0 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
135c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
135d0 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
135e0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
135f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
13600 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
13610 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
13620 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
13630 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
13640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13650 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
13660 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
13670 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
13680 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
13690 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
136a0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
136b0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
136c0 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
136d0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
136e0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
136f0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
13700 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13710 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13720 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
13730 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
13740 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
13750 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
13760 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
13770 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
13780 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
13790 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
137a0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
137b0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
137c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
137d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
137e0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
137f0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
13800 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
13810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13820 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
13830 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
13840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
13850 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
13860 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13870 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
13880 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138a0 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
138b0 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
138c0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
138d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
138e0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
138f0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
13900 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
13910 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
13920 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
13930 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
13940 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
13950 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
13960 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
13970 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
13980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13990 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
139a0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
139b0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
139c0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
139d0 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
139e0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
139f0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
13a00 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
13a10 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
13a20 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
13a30 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
13a40 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
13a50 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
13a60 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69 6e  Size(pVfs);.  in
13a70 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d  t nDefaultPage =
13a80 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13a90 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61  PAGE_SIZE;.  cha
13aa0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
13ab0 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  ;.  int nPathnam
13ac0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 0;..  /* The
13ad0 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20   default return 
13ae0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
13af0 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  r */.  *ppPager 
13b00 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
13b10 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
13b20 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
13b30 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
13b40 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
13b50 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
13b60 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
13b70 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
13b80 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
13b90 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
13ba0 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
13bb0 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
13bc0 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
13bd0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
13be0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
13bf0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
13c00 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
13c10 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
13c20 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
13c30 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
13c40 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
13c50 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
13c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13c70 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
13c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
13c90 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
13ca0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
13cb0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
13cc0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
13cd0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
13ce0 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
13cf0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13d00 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13d10 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
13d20 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
13d30 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
13d40 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13d50 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13d70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
13d80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13d90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13da0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
13db0 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d   strlen(zPathnam
13dc0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  e);.  }..  /* Al
13dd0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
13de0 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  r the pager stru
13df0 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65  cture */.  pPage
13e00 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r = sqlite3Mallo
13e10 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f  cZero(.    sizeo
13e20 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20  f(*pPager) +    
13e30 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
13e40 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
13e50 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
13e60 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
13e70 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13e80 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20   structure */ . 
13e90 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c     pVfs->szOsFil
13ea0 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20 2f  e * 3 +        /
13eb0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61 6e  * The main db an
13ec0 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  d two journal fi
13ed0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50  les */ .    3*nP
13ee0 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20  athname + 40    
13ef0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
13f00 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79  name, zDirectory
13f10 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  , zJournal */.  
13f20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
13f30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13f40 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
13f50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13f60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13f70 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50  pPtr = (u8 *)&pP
13f80 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
13f90 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
13fa0 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
13fb0 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
13fc0 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
13fd0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
13fe0 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
13ff0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
14000 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
14010 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
14020 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
14030 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
14040 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a  s->szOsFile*2];.
14050 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
14060 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
14070 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
14080 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e*2+journalFileS
14090 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
140a0 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
140b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
140c0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
140d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
140e0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
140f0 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
14100 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  +1];.  pPager->p
14110 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66  Vfs = pVfs;.  if
14120 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
14130 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
14140 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
14150 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
14160 65 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e+1);.    sqlite
14170 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
14180 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
14190 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
141a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
141b0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
141c0 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
141d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74   ){.    if( nPat
141e0 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50  hname>(pVfs->mxP
141f0 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66  athname - sizeof
14200 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b  ("-journal")) ){
14210 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14220 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
14230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14240 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
14250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14260 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
14270 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
14280 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20  ager->fd,.      
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c     pPager->vfsFl
142b0 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
142c0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
142d0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
142e0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
142f0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
14300 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
14310 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
14320 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
14330 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20        ** choose 
14340 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
14350 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
14360 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
14370 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
14380 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
14390 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
143a0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
143b0 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f:.      **.    
143c0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
143d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
143e0 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ZE,.      **    
143f0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
14400 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
14410 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
14420 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
14430 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
14440 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
14450 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
14460 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14480 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
14490 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
144a0 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  SectorSize = sql
144b0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
144c0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
144d0 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61 75        if( nDefau
144e0 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72 53 69  ltPage<iSectorSi
144f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
14500 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69  nDefaultPage = i
14510 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  SectorSize;.    
14520 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14530 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
14540 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
14550 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
14560 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
14570 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
14580 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
14590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
145a0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
145b0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
145c0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
145d0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
145e0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
145f0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
14600 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
14610 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
14620 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
14630 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
14640 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
14650 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74 50 61  or(ii=nDefaultPa
14660 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  ge; ii<=SQLITE_M
14670 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
14680 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
14690 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
146a0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
146b0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
146c0 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61 67 65  ) ) nDefaultPage
146d0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
146e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
146f0 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
14700 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53 51 4c  nDefaultPage>SQL
14710 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
14720 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
14730 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50         nDefaultP
14740 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  age = SQLITE_MAX
14750 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
14760 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
14770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
14780 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62 20 29  lse if( !memDb )
14790 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
147a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
147b0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
147c0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
147d0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
147e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
147f0 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
14800 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
14810 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
14820 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
14830 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
14840 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
14850 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
14860 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
14870 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
14880 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
14890 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20  XCLUSIVE;.  }.. 
148a0 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72   if( pPager && r
148b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
148c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
148d0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 4d  Space = sqlite3M
148e0 61 6c 6c 6f 63 5a 65 72 6f 28 6e 44 65 66 61 75  allocZero(nDefau
148f0 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ltPage);.  }..  
14900 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
14910 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
14920 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
14930 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
14940 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
14950 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
14960 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
14970 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
14980 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
14990 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
149a0 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
149b0 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
149c0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
149d0 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
149e0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
149f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
14a00 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14a10 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
14a20 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
14a30 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
14a40 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
14a50 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
14a60 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  ..  PAGERTRACE3(
14a70 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
14a80 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
14a90 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
14aa0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
14ab0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
14ac0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
14ad0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
14ae0 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  me))..  /* Fill 
14af0 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  in Pager.zDirect
14b00 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  ory[] */.  memcp
14b10 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
14b20 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46  tory, pPager->zF
14b30 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
14b40 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73  me+1);.  for(i=s
14b50 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44  trlen(pPager->zD
14b60 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26  irectory); i>0 &
14b70 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
14b80 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
14b90 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
14ba0 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
14bb0 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
14bc0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
14bd0 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a  ger.zJournal[] *
14be0 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
14bf0 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e ){.    memcpy(
14c00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
14c10 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14c20 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
14c30 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
14c40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
14c50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
14c60 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c 73  nal", 9);.  }els
14c70 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  e{.    pPager->z
14c80 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
14c90 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a  ..  /* pPager->j
14ca0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20  ournalOpen = 0; 
14cb0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  */.  pPager->use
14cc0 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
14cd0 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
14ce0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
14cf0 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63  lock = noReadloc
14d00 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  k && readOnly;. 
14d10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
14d20 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
14d30 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
14d40 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
14d50 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
14d60 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
14d70 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
14d80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
14d90 53 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50  Size = nDefaultP
14da0 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  age;.  /* pPager
14db0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
14dc0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14dd0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
14de0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
14df0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
14e00 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
14e10 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  100;.  pPager->m
14e20 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
14e30 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
14e40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
14e50 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
14e60 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
14e70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
14e80 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
14e90 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
14ea0 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
14eb0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
14ec0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
14ed0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
14ee0 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73   tempFile;.  ass
14ef0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
14f00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14f10 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
14f20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
14f30 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
14f40 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
14f50 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
14f60 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
14f70 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
14f80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14f90 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a  de = tempFile; .
14fa0 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
14fb0 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
14fc0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
14fd0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
14fe0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
14ff0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
15000 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
15010 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
15020 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
15030 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
15040 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30  pPager->noSync?0
15050 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  :1);.  pPager->s
15060 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
15070 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
15080 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
15090 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
150a0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
150b0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
150c0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
150d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
150e0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
150f0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
15100 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ra);.  pPager->j
15110 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
15120 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
15130 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
15140 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50  MIT;.  assert(pP
15150 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15160 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46  ds||memDb||tempF
15170 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d  ile);.  if( !mem
15180 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63  Db ){.    setSec
15190 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
151a0 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
151b0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
151c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
151d0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
151e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
151f0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
15200 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
15210 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
15220 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15230 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
15240 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
15250 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49   0;.  pPager->iI
15260 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66  nUseDB = 0;.  if
15270 28 20 21 6d 65 6d 44 62 20 29 7b 0a 23 69 66 6e  ( !memDb ){.#ifn
15280 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
15290 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65  _NOOP.    sqlite
152a0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
152b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
152c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
152d0 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
152e0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
152f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
15300 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65  utex);.    pPage
15310 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  r->pNext = sqlit
15320 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20  e3PagerList;.   
15330 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
15340 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  rList ){.      a
15350 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
15360 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d  gerList->pPrev==
15370 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
15380 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72  e3PagerList->pPr
15390 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  ev = pPager;.   
153a0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
153b0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71  Prev = 0;.    sq
153c0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
153d0 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c   pPager;.    sql
153e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
153f0 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e  (mutex);.  }.#en
15400 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
15410 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15420 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
15430 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
15440 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
15450 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
15460 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
15470 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
15480 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
15490 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
154a0 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
154b0 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
154c0 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
154d0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
154e0 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
154f0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
15500 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
15510 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
15520 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
15530 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
15540 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
15550 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
15560 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
15570 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
15580 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
15590 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
155a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
155b0 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
155c0 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
155d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
155e0 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
155f0 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
15600 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
15610 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
15620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15630 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72  gerSetDestructor
15640 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15650 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
15660 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
15670 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
15680 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
15690 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
156a0 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
156b0 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
156c0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
156d0 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
156e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
156f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
15700 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
15710 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
15720 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
15730 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15740 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
15750 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
15760 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
15770 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
15780 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
15790 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
157a0 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
157b0 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
157c0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
157d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
157e0 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
157f0 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
15800 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
15810 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
15820 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
15830 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
15840 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
15850 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  e to *pPageSize.
15860 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
15870 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 69 73  new page size is
15880 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74  .** inappropriat
15890 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
158a0 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
158b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a   is set to that.
158c0 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ** value before 
158d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
158e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
158f0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
15900 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
15910 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20  ageSize){.  int 
15920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15930 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
15940 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
15950 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
15960 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
15970 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
15980 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
15990 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
159a0 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
159b0 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70  eSize!=pPager->p
159c0 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21  ageSize .   && !
159d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
159e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
159f0 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
15a00 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
15a10 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
15a20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
15a30 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
15a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15a50 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
15a60 20 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28       pagerEnter(
15a70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
15a80 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
15a90 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
15aa0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
15ab0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74  eSize;.      set
15ac0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
15ad0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
15ae0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70  3_free(pPager->p
15af0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
15b00 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15b10 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
15b20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
15b30 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
15b40 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
15b50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15b60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15b70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
15b80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
15b90 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
15ba0 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
15bb0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
15bc0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
15bd0 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
15be0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
15bf0 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
15c00 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
15c10 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
15c20 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
15c30 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
15c40 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
15c50 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
15c60 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
15c70 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
15c80 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
15c90 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
15ca0 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
15cb0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
15cc0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
15cd0 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
15ce0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
15cf0 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
15d00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
15d10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
15d20 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
15d30 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
15d40 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
15d50 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
15d60 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
15d70 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
15d80 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
15d90 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
15da0 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
15db0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
15dc0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
15dd0 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
15de0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
15df0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15e00 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
15e10 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
15e20 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
15e30 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
15e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
15e50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
15e60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15e70 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
15e80 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
15e90 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
15ea0 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
15eb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
15ec0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
15ed0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15ee0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
15ef0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
15f00 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
15f10 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
15f20 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
15f30 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
15f40 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
15f50 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
15f60 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
15f70 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
15f80 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
15f90 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
15fa0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
15fb0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
15fc0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
15fd0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
15fe0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
15ff0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
16000 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
16010 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16020 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
16030 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
16040 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
16050 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
16060 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
16070 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
16080 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
16090 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
160a0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
160b0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
160c0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
160d0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
160e0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
160f0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
16100 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
16110 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
16120 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
16130 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
16140 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16150 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
16160 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
16170 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
16180 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
16190 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
161a0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
161b0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
161c0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
161d0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
161e0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
161f0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
16200 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
16210 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
16220 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
16230 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
16240 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
16250 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
16260 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
16270 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
16280 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
16290 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
162a0 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
162b0 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
162c0 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
162d0 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
162e0 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
162f0 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
16300 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
16310 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
16320 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
16330 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
16340 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
16350 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
16360 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
16370 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
16380 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
16390 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
163a0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
163b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
163c0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
163d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
163e0 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
163f0 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42  ;.  assert(MEMDB
16400 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ||pPager->fd->pM
16410 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
16420 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
16430 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
16440 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54  thods ){.    IOT
16450 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
16460 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
16470 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
16480 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
16490 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
164a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
164b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
164c0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
164d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
164e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
164f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16500 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
16510 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
16520 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
16530 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
16540 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
16550 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
16560 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
16570 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
16580 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
16590 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
165a0 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
165b0 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
165c0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
165d0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
165e0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
165f0 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
16600 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
16610 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
16620 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
16630 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
16640 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
16650 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
16660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
16670 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
16680 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
16690 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
166a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
166b0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
166c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
166d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
166e0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  1;.  }.  if( pPa
166f0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
16700 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
16710 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
16720 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
16730 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
16740 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
16750 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
16760 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
16770 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
16780 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
16790 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
167a0 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
167b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
167c0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
167d0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
167e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
167f0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
16800 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
16810 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
16820 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
16830 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
16840 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
16850 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
16860 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16870 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
16880 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
16890 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
168a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
168b0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
168c0 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
168d0 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
168e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
168f0 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
16900 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
16910 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
16920 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
16930 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
16940 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
16950 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
16960 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
16970 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
16980 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
16990 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
169a0 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
169b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
169c0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
169d0 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
169e0 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
169f0 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
16a00 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
16a10 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
16a20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
16a30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
16a40 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
16a50 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
16a60 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
16a70 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
16a80 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73  ink pPg from its
16a90 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
16aa0 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
16ab0 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
16ac0 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
16ad0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
16ae0 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
16af0 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
16b00 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
16b10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
16b20 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f  gerMovepage() ro
16b30 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
16b40 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
16b50 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
16b60 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
16b70 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
16b80 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
16b90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16ba0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
16bb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16bc0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
16bd0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
16be0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
16bf0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
16c00 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
16c10 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  h==0 );.    retu
16c20 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
16c30 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
16c40 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
16c50 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
16c60 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
16c70 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
16c80 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
16c90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16ca0 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20  aHash[pPg->pgno 
16cb0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
16cc0 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20  -1)]!=pPg );.   
16cd0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
16ce0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
16cf0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
16d00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
16d10 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  = pPg->pgno & (p
16d20 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
16d30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
16d40 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
16d50 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  xtHash;.  }.  if
16d60 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63  ( MEMDB ){.    c
16d70 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
16d80 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16d90 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70  Pager));.  }.  p
16da0 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
16db0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
16dc0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
16dd0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
16de0 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
16df0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
16e00 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
16e10 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
16e20 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
16e30 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
16e40 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
16e50 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
16e60 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
16e70 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
16e80 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
16e90 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
16ea0 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69 73  om free page lis
16eb0 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65  t */.  lruListRe
16ec0 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  move(pPg);..  /*
16ed0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
16ee0 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
16ef0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
16f00 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
16f10 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
16f20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
16f30 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  d to truncate th
16f40 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64  e cache when a d
16f50 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72  atabase.** is tr
16f60 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66  uncated.  Drop f
16f70 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c  rom the cache al
16f80 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
16f90 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  no is.** larger 
16fa0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
16fb0 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
16fc0 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  erenced..**.** R
16fd0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
16fe0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
16ff0 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
17000 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  eroed..**.** Act
17010 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f  ually, at the po
17020 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
17030 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77   is called, it w
17040 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72  ould be.** an er
17050 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65  ror to have a re
17060 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20  ferenced page.  
17070 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  But rather than 
17080 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70  delete.** that p
17090 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65  age and guarante
170a0 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73  e a subsequent s
170b0 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d  egfault, it seem
170c0 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a  s better.** to z
170d0 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20  ero it and hope 
170e0 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75  that we error ou
170f0 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61  t sanely..*/.sta
17100 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
17110 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
17120 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17130 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
17140 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
17150 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
17160 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
17170 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
17180 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
17190 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
171a0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
171b0 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
171c0 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
171d0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
171e0 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
171f0 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
17200 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
17210 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
17220 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
17230 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
17240 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
17250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
17260 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
17270 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ll;.      IOTRAC
17280 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
17290 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
172a0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
172b0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
172c0 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
172d0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e  count);.      un
172e0 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
172f0 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
17300 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
17310 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
17320 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
17330 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
17340 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
17350 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
17360 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
17370 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
17380 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
17390 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
173a0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
173b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
173c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
173d0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
173e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
173f0 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
17400 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
17410 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
17420 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17430 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
17440 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
17450 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
17460 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
17470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17480 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
17490 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
174a0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
174b0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
174c0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
174d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
174e0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
174f0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
17500 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
17510 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
17520 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
17530 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
17540 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
17550 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
17560 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
17570 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
17580 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
17590 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
175a0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
175b0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
175c0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
175d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
175e0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
175f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
17600 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
17610 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17620 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
17630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
17650 66 28 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  f( pPager->pBusy
17660 48 61 6e 64 6c 65 72 20 29 20 70 50 61 67 65 72  Handler ) pPager
17670 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
17680 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 64  nBusy = 0;.    d
17690 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
176a0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
176b0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
176c0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
176d0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
176e0 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
176f0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
17700 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
17710 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
17720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17730 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
17740 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
17750 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
17760 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
17770 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
17780 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17790 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
177a0 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
177b0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
177c0 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
177d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
177e0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
177f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
17800 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
17810 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
17820 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
17830 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
17840 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
17850 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17860 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
17870 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
17880 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
17890 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
178a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
178b0 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
178c0 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
178d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
178e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
178f0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
17900 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
17910 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
17920 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
17930 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
17940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17950 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  _OK;.  }.  pager
17960 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
17970 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
17980 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  l(pPager);.  pag
17990 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
179a0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
179b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
179c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
179d0 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
179e0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
179f0 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
17a00 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70  uncating. */.  p
17a10 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
17a20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
17a30 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
17a40 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
17a50 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  OCK);.  pagerLea
17a60 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
17a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17a80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17a90 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
17aa0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
17ab0 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72  ger, nPage);.  r
17ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ad0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
17ae0 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
17af0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
17b00 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
17b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
17b20 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
17b30 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
17b40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
17b50 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
17b60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
17b70 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
17b80 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
17b90 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
17ba0 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
17bb0 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
17bc0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
17bd0 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
17be0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
17bf0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
17c00 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
17c10 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
17c20 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
17c30 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
17c40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17c50 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
17c60 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
17c70 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
17c80 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
17c90 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
17ca0 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
17cb0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
17cc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
17cd0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
17ce0 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
17cf0 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
17d00 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
17d10 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
17d20 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
17d30 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
17d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17d50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17d60 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
17d70 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45  GEMENT.  if( !ME
17d80 4d 44 42 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  MDB ){.#ifndef S
17d90 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50  QLITE_MUTEX_NOOP
17da0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
17db0 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69  ex *mutex = sqli
17dc0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
17dd0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
17de0 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
17df0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
17e00 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
17e10 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17e20 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
17e30 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e   pPager->pPrev->
17e40 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
17e50 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
17e60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
17e70 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
17e80 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
17e90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17ea0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
17eb0 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50  Pager->pNext->pP
17ec0 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50  rev = pPager->pP
17ed0 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rev;.    }.    s
17ee0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17ef0 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
17f00 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
17f10 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17f20 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
17f30 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
17f40 6e 28 2d 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  n(-1);.  pPager-
17f50 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
17f60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17f70 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67  eMode = 0;.  pag
17f80 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17f90 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  ;.  pagerUnlockA
17fa0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
17fb0 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  r);.  enable_sim
17fc0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17fd0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75  ();.  sqlite3Fau
17fe0 6c 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31 29 3b  ltEndBenign(-1);
17ff0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
18000 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
18010 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18020 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
18030 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
18040 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
18050 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18060 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18070 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
18080 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
18090 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
180a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
180b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
180c0 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
180d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
180e0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
180f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
18100 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
18110 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
18120 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
18130 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
18140 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
18150 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
18160 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
18170 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
18180 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
18190 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f    */..  sqlite3_
181a0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
181b0 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sh);.  sqlite3_f
181c0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
181d0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
181e0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
181f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18200 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
18210 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
18220 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
18230 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
18240 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
18250 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
18260 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
18270 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
18280 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
18290 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
182a0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
182b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
182c0 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
182d0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
182e0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
182f0 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
18300 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
18310 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
18320 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
18330 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
18340 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
18350 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
18360 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
18370 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
18380 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
18390 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
183a0 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
183b0 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
183c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
183d0 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
183e0 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
183f0 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
18400 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
18410 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
18420 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
18430 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
18440 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
18450 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
18460 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
18470 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
18480 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
18490 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
184a0 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
184b0 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69 73  t. */.    lruLis
184c0 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
184d0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
184e0 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
184f0 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23 69 66 64  ->nRef++;.}.#ifd
18500 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
18510 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
18520 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
18530 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
18540 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
18550 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
18560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18570 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
18580 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
18590 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
185a0 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
185b0 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
185c0 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
185d0 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
185e0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
185f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18600 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
18610 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
18620 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
18630 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
18640 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
18650 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
18660 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72  e *pPg){.  pager
18670 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65  Enter(pPg->pPage
18680 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  r);.  page_ref(p
18690 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  Pg);.  pagerLeav
186a0 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pPg->pPager);.
186b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
186c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
186d0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
186e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
186f0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
18700 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
18710 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
18720 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
18730 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
18740 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
18750 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
18760 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
18770 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
18780 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
18790 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
187a0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
187b0 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
187c0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
187d0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
187e0 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
187f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
18800 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
18810 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
18820 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
18830 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
18840 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
18850 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
18860 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
18870 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
18880 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
18890 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
188a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
188b0 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
188c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
188d0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
188e0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
188f0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
18900 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
18910 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
18920 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
18930 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
18940 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
18950 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
18960 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
18970 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
18980 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
18990 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
189a0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
189b0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
189c0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
189d0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
189e0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
189f0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
18a00 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
18a10 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
18a20 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
18a30 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
18a40 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
18a50 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
18a60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
18a70 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
18a80 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
18a90 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
18aa0 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
18ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
18ac0 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
18ad0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
18ae0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
18af0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
18b00 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
18b10 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
18b20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
18b30 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
18b40 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
18b50 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
18b60 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
18b70 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
18b80 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
18b90 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
18ba0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
18bb0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
18bc0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
18bd0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
18be0 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
18bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
18c00 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
18c10 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
18c20 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
18c30 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
18c40 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
18c50 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
18c60 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
18c70 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
18c80 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
18c90 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
18ca0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
18cb0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
18cc0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
18cd0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
18ce0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
18cf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18d00 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
18d10 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
18d20 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
18d30 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
18d40 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18d50 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
18d60 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
18d70 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
18d80 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
18d90 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
18da0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
18db0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
18dc0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
18dd0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
18de0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
18df0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
18e00 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
18e10 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
18e20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
18e30 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
18e40 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
18e50 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
18e60 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
18e70 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
18e80 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
18e90 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18ea0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
18eb0 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
18ec0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
18ed0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
18ee0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
18ef0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
18f00 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
18f10 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
18f20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
18f30 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
18f40 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
18f50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
18f60 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
18f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
18f80 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
18f90 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
18fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
18fb0 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20  4 jrnlOff;.     
18fc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
18fd0 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
18fe0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18ff0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
19000 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
19010 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
19020 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
19030 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
19040 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
19050 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
19060 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
19070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19080 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
19090 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
190a0 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
190b0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
190c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
190d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c   }..        jrnl
190e0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
190f0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
19100 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
19110 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
19120 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
19130 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
19140 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20  jrnlOff, 4));.  
19150 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
19160 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
19170 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61  fd, jrnlOff, pPa
19180 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
19190 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
191a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
191b0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
191c0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
191d0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
191e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
191f0 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
19200 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
19210 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
19220 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
19230 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
19240 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
19250 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
19260 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
19270 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
19280 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
19290 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
192a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
192b0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
192c0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
192d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
192e0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
192f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
19300 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19310 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
19320 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
19330 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
19340 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
19350 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
19360 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
19370 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
19380 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
19390 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
193a0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
193b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
193c0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c 69  .    }.    lruLi
193d0 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
193e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 23  (pPager);.  }..#
193f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
19400 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
19410 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
19420 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
19430 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
19440 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
19450 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
19460 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
19470 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
19480 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
19490 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
194a0 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
194b0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
194c0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
194d0 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
194e0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
194f0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
19500 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19510 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
19520 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  d==pPager->lru.p
19530 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
19540 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
19550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
19560 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61   two lists of pa
19570 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  ges connected by
19580 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70   pDirty and in p
19590 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f  gno order..** Do
195a0 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67   not both fixing
195b0 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20   the pPrevDirty 
195c0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
195d0 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65  tic PgHdr *merge
195e0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
195f0 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b  *pA, PgHdr *pB){
19600 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c  .  PgHdr result,
19610 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c   *pTail;.  pTail
19620 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68   = &result;.  wh
19630 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b  ile( pA && pB ){
19640 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e  .    if( pA->pgn
19650 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  o<pB->pgno ){.  
19660 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19670 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54  y = pA;.      pT
19680 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  ail = pA;.      
19690 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b  pA = pA->pDirty;
196a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
196b0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
196c0 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69  = pB;.      pTai
196d0 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42  l = pB;.      pB
196e0 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20   = pB->pDirty;. 
196f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
19700 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  A ){.    pTail->
19710 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d  pDirty = pA;.  }
19720 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20  else if( pB ){. 
19730 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
19740 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = pB;.  }else{.
19750 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19760 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
19770 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74  urn result.pDirt
19780 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74  y;.}../*.** Sort
19790 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
197a0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
197b0 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20  order by pgno.  
197c0 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e  Pages are.** con
197d0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
197e0 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20   pointers.  The 
197f0 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
19800 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75  ers are.** corru
19810 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72  pted by this sor
19820 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  t..*/.#define N_
19830 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
19840 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53  C 25.#define N_S
19850 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20  ORT_BUCKET      
19860 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54   25.#ifdef SQLIT
19870 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c  E_TEST.  int sql
19880 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
19890 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20  t_bucket = 0;.  
198a0 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55  #undef N_SORT_BU
198b0 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e  CKET.  #define N
198c0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20  _SORT_BUCKET \. 
198d0 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72    (sqlite3_pager
198e0 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73  _n_sort_bucket?s
198f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
19900 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52  ort_bucket:N_SOR
19910 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a  T_BUCKET_ALLOC).
19920 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67  #endif.static Pg
19930 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
19940 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
19950 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
19960 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c  T_BUCKET_ALLOC],
19970 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
19980 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
19990 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65  eof(a));.  while
199a0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d  ( pIn ){.    p =
199b0 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20   pIn;.    pIn = 
199c0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
199d0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
199e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
199f0 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b  ORT_BUCKET-1; i+
19a00 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  +){.      if( a[
19a10 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
19a20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20   a[i] = p;.     
19a30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
19a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19a50 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
19a60 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
19a70 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20      a[i] = 0;.  
19a80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19a90 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55  if( i==N_SORT_BU
19aa0 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20  CKET-1 ){.      
19ab0 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20  /* Coverage: To 
19ac0 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20  get here, there 
19ad0 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f  need to be 2^(N_
19ae0 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20  SORT_BUCKET) .  
19af0 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20      ** elements 
19b00 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73  in the input lis
19b10 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69  t. This is possi
19b20 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74  ble, but impract
19b30 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ical..      ** T
19b40 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65  esting this line
19b50 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   is the point of
19b60 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
19b70 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
19b80 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
19b90 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ucket..      */.
19ba0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72        a[i] = mer
19bb0 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
19bc0 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
19bd0 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f    p = a[0];.  fo
19be0 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=1; i<N_SORT_
19bf0 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20  BUCKET; i++){.  
19c00 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
19c10 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20  list(p, a[i]);. 
19c20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
19c30 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
19c40 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
19c50 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
19c60 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
19c70 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
19c80 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
19c90 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
19ca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19cb0 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
19cc0 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
19cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19ce0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
19cf0 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
19d00 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
19d10 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  r;.  PgHdr *p;. 
19d20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
19d30 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
19d40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
19d50 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
19d60 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
19d70 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
19d80 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
19d90 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
19da0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
19db0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
19dc0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
19dd0 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
19de0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
19df0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
19e00 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
19e10 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
19e20 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
19e30 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
19e40 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
19e50 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
19e60 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
19e70 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
19e80 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
19e90 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
19ea0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
19eb0 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
19ec0 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
19ed0 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
19ee0 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
19ef0 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
19f00 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
19f10 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
19f20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
19f30 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
19f40 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
19f50 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
19f60 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
19f70 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
19f80 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
19f90 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
19fa0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
19fb0 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
19fc0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
19fd0 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
19fe0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
19ff0 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
1a000 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1a010 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
1a020 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
1a030 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1a040 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
1a050 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
1a060 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
1a070 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
1a080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
1a090 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
1a0a0 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
1a0b0 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
1a0c0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
1a0d0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
1a0e0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1a0f0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1a100 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1a110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a120 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1a130 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74  rc;.  }..  pList
1a140 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74   = sort_pagelist
1a150 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28 70  (pList);.  for(p
1a160 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1a170 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1a180 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29 3b  ert( p->dirty );
1a190 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20  .    p->dirty = 
1a1a0 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
1a1b0 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a  pList ){..    /*
1a1c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1a1d0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
1a1e0 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
1a1f0 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  w. */.    if( !p
1a200 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1a210 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ods ){.      ass
1a220 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70  ert(pPager->temp
1a230 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20  File);.      rc 
1a240 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1a250 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
1a260 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1a270 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
1a280 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1a290 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1a2a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1a2b0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
1a2c0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1a2d0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1a2e0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
1a2f0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
1a300 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
1a310 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1a320 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
1a330 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
1a340 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
1a350 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
1a360 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
1a370 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
1a380 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
1a390 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
1a3a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
1a3b0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
1a3c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1a3d0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1a3e0 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e  et = (pList->pgn
1a3f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1a400 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1a410 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
1a420 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50  CODEC2(pPager, P
1a430 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
1a440 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
1a450 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45  , 6);.      PAGE
1a460 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20 25  RTRACE4("STORE %
1a470 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1a480 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1a490 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1a4a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
1a4b0 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  st->pgno, pager_
1a4c0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
1a4d0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1a4e0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1a4f0 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  , pPager, pList-
1a500 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
1a510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1a520 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1a530 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1a540 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
1a550 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1a560 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1a570 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
1a580 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1a590 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
1a5a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
1a5b0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  t->pgno==1 ){.  
1a5c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1a5d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1a5e0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
1a5f0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1a600 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1a610 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
1a620 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
1a630 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1a640 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
1a650 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1a660 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
1a670 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
1a680 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1a690 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a6a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1a6b0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
1a6c0 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
1a6d0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1a6e0 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
1a6f0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
1a700 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
1a710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
1a730 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
1a740 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
1a750 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
1a760 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a770 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
1a780 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
1a790 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
1a7a0 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
1a7b0 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
1a7c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
1a7d0 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
1a7e0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
1a7f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23 69  er *pPager){..#i
1a800 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
1a810 2a 20 56 65 72 69 66 79 20 74 68 65 20 73 61 6e  * Verify the san
1a820 69 74 79 20 6f 66 20 74 68 65 20 64 69 72 74 79  ity of the dirty
1a830 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20 61 72   list when we ar
1a840 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20 69  e running.  ** i
1a850 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f 64 65  n debugging mode
1a860 2e 20 20 54 68 69 73 20 69 73 20 65 78 70 65 6e  .  This is expen
1a870 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 0a  sive, so do not.
1a880 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e 20    ** do this on 
1a890 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 20  a normal build. 
1a8a0 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30 3b  */.  int n1 = 0;
1a8b0 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a 20  .  int n2 = 0;. 
1a8c0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f 72   PgHdr *p;.  for
1a8d0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
1a8e0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
1a8f0 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72 74 79  l){ if( p->dirty
1a900 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72   ) n1++; }.  for
1a910 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  (p=pPager->pDirt
1a920 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  y; p; p=p->pDirt
1a930 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61 73  y){ n2++; }.  as
1a940 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b 0a  sert( n1==n2 );.
1a950 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1a960 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
1a970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a980 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 61   1 if there is a
1a990 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
1a9a0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
1a9b0 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
1a9c0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
1a9d0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
1a9e0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
1a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1aa00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aa10 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
1aa20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1aa30 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
1aa40 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
1aa50 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
1aa60 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
1aa70 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
1aa80 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
1aa90 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
1aaa0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1aab0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
1aac0 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74  if unable to det
1aad0 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75  ermine the statu
1aae0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1aaf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ab00 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70  tine does not op
1ab10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1ab20 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69  ile to examine i
1ab30 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  ts.** content.  
1ab40 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e  Hence, the journ
1ab50 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1ab60 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1ab70 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
1ab80 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
1ab90 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64  een deleted, and
1aba0 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f   hence not be ho
1abb0 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65  t.  Or.** the he
1abc0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
1abd0 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72  nal might be zer
1abe0 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72  oed out.  This r
1abf0 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e  outine.** does n
1ac00 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65 73  ot discover thes
1ac10 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e  e cases of a non
1ac20 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69  -hot journal - i
1ac30 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  f the.** journal
1ac40 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
1ac50 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68   is not empty th
1ac60 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
1ac70 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e  es it.** is hot.
1ac80 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79    The pager_play
1ac90 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  back() routine w
1aca0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
1acb0 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  t the.** journal
1acc0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
1acd0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c  lly hot and will
1ace0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1acf0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
1ad00 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1ad10 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
1ad20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ad30 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 65  ->pVfs;.  int re
1ad40 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1ad50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1ad60 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
1ad70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
1ad80 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 65  nt rc;.    int e
1ad90 78 69 73 74 73 3b 0a 20 20 20 20 69 6e 74 20 6c  xists;.    int l
1ada0 6f 63 6b 65 64 3b 0a 0a 20 20 20 20 72 63 20 3d  ocked;..    rc =
1adb0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1adc0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1add0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1ade0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1adf0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1ae00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ae10 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
1ae20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ae30 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1ae40 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
1ae50 6f 63 6b 65 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ocked);.    }.. 
1ae60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae70 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26  E_OK && exists &
1ae80 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
1ae90 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 73     int nPage = s
1aea0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1aeb0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1aec0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1aed0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1aee0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1aef0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1af00 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
1af10 65 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20  exists = 0;.    
1af20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
1af30 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  e<0 ){.        r
1af40 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1af50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1af60 0a 20 20 20 20 72 65 73 20 3d 20 28 72 63 21 3d  .    res = (rc!=
1af70 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 2d 31 20 3a  SQLITE_OK ? -1 :
1af80 20 28 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63   (exists && !loc
1af90 6b 65 64 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ked));.  }..  re
1afa0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1afb0 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
1afc0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
1afd0 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
1afe0 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
1aff0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
1b000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b010 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
1b020 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
1b030 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
1b040 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
1b050 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
1b060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b070 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
1b080 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1b090 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
1b0a0 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
1b0b0 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20  g = 0;..  /* It 
1b0c0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
1b0d0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
1b0e0 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   unless the page
1b0f0 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f  r object.  ** po
1b100 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61 67  inted to by pPag
1b110 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  er has at least 
1b120 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28 70  one free page (p
1b130 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30  age with nRef==0
1b140 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  )..  */ .  asser
1b150 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73  t(!MEMDB);.  ass
1b160 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
1b170 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46  pFirst);..  /* F
1b180 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
1b190 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
1b1a0 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
1b1b0 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
1b1c0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
1b1d0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
1b1e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
1b1f0 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
1b200 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1b210 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
1b220 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
1b230 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1b240 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
1b250 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
1b260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1b270 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
1b280 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
1b290 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
1b2a0 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
1b2b0 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
1b2c0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
1b2d0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
1b2e0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
1b2f0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
1b300 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
1b310 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 7b  r->lru.pFirst ){
1b320 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1b330 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1b340 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
1b350 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1b360 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1b370 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
1b380 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
1b390 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b3a0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1b3b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b3c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1b3d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
1b3e0 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63  lSync && 0==(iDc
1b3f0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1b400 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
1b410 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
1b420 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
1b430 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
1b440 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
1b450 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
1b460 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
1b470 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
1b480 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
1b490 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
1b4a0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
1b4b0 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
1b4c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
1b4d0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
1b4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  .        ** alre
1b4f0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1b500 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b510 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
1b520 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 20 20  ader is.        
1b530 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
1b540 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
1b550 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
1b560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1b570 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1b580 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b590 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b5a0 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
1b5b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b5c0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1b5d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b5e0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1b5f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b600 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1b610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b620 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b630 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1b640 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
1b650 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20  .pFirst;.  }..  
1b660 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b670 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  f==0 );..  /* Wr
1b680 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
1b690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b6a0 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
1b6b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1b6c0 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
1b6d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1b6e0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
1b6f0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
1b700 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d  Sync==0 );.    m
1b710 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1b720 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b730 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1b740 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
1b750 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1b760 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
1b770 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1b780 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b7b0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1b7c0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 7c 7c  pPg->dirty==0 ||
1b7d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b7e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1b7f0 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63   page we are rec
1b800 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64  ycling is marked
1b810 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
1b820 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65  ck, then.  ** se
1b830 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
1b840 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1b850 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
1b860 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1b870 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1b880 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
1b890 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
1b8a0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1b8b0 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
1b8c0 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
1b8d0 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
1b8e0 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
1b8f0 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
1b900 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
1b910 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
1b920 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
1b930 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
1b940 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
1b950 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
1b960 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
1b970 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
1b980 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
1b990 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
1b9a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1b9b0 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
1b9c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1b9d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1b9e0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
1b9f0 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b  "ALWAYS_ROLLBACK
1ba00 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1ba10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  .    pPager->alw
1ba20 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1ba30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
1ba40 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
1ba50 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
1ba60 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
1ba70 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69  able.  */.  unli
1ba80 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61  nkPage(pPg);.  a
1ba90 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1baa0 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20  ==0 );..  *ppPg 
1bab0 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1bac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1bad0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bae0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1baf0 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  MENT./*.** This 
1bb00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bb10 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
1bb20 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
1bb30 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
1bb40 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
1bb50 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
1bb60 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
1bb70 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
1bb80 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
1bb90 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
1bba0 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
1bbb0 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a  ite3_free()ed..*
1bbc0 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
1bbd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1bbe0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
1bbf0 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
1bc00 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
1bc10 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
1bc20 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
1bc30 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1bc40 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1bc50 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
1bc60 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
1bc70 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ased..*/.int sql
1bc80 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
1bc90 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
1bca0 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  {.  int nRelease
1bcb0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1bcc0 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
1bcd0 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66  ry released so f
1bce0 61 72 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  ar */.  Pager *p
1bcf0 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1bd00 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1bd10 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a  ng over pagers *
1bd20 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
1bd30 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20 20  *savedBusy;     
1bd40 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66  /* Saved copy of
1bd50 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1bd60 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1bd70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1bd80 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d   Acquire the mem
1bd90 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d  ory-management m
1bda0 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  utex.  */.#ifnde
1bdb0 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
1bdc0 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OOP.  sqlite3_mu
1bdd0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1bde0 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75    /* The MEM2 mu
1bdf0 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  tex */.  mutex =
1be00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1be10 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1be20 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
1be30 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1be40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
1be50 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61  ex);..  /* Signa
1be60 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  l all database c
1be70 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1be80 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  memory managemen
1be90 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20  t wants.  ** to 
1bea0 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74  have access to t
1beb0 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a  he pagers..  */.
1bec0 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c    for(pPager=sql
1bed0 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70  ite3PagerList; p
1bee0 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50  Pager; pPager=pP
1bef0 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
1bf00 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73     pPager->iInUs
1bf10 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  eMM = 1;.  }..  
1bf20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1bf30 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20  E_OK && (nReq<0 
1bf40 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
1bf50 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  q) ){.    PgHdr 
1bf60 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20  *pPg;.    PgHdr 
1bf70 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20  *pRecycled;. .  
1bf80 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1bf90 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1bfa0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1bfb0 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28   require a sync(
1bfc0 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69  ). If.    ** thi
1bfd0 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
1bfe0 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74  e, find one that
1bff0 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20   does require a 
1c000 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  sync()..    */. 
1c010 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1c020 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
1c030 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1c040 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1c050 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  RU));.    pPg = 
1c060 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1c070 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  st.pFirstSynced;
1c080 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1c090 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e  && (pPg->needSyn
1c0a0 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  c || pPg->pPager
1c0b0 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20  ->iInUseDB) ){. 
1c0c0 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1c0d0 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1c0e0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20   }.    if( !pPg 
1c0f0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  ){.      pPg = s
1c100 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
1c110 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  t.pFirst;.      
1c120 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50  while( pPg && pP
1c130 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1c140 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eDB ){.        p
1c150 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e  Pg = pPg->gfree.
1c160 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1c170 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1c180 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
1c190 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1c1a0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1c1b0 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20  ATIC_LRU));..   
1c1c0 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74   /* If pPg==0, t
1c1d0 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62  hen the block ab
1c1e0 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20 74  ove has failed t
1c1f0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1c200 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e  .    ** recycle.
1c210 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
1c220 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20  turn early - no 
1c230 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77  further memory w
1c240 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
1c250 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leased..    */. 
1c260 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62 72     if( !pPg ) br
1c270 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  eak;..    pPager
1c280 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1c290 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67 2d      assert(!pPg-
1c2a0 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1c2b0 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1c2c0 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  irst);.    asser
1c2d0 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  t(pPg->needSync 
1c2e0 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  || pPg==pPager->
1c2f0 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1c300 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42  );.  .    savedB
1c310 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42  usy = pPager->pB
1c320 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
1c330 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1c340 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  dler = 0;.    rc
1c350 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
1c360 28 70 50 61 67 65 72 2c 20 26 70 52 65 63 79 63  (pPager, &pRecyc
1c370 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  led);.    pPager
1c380 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
1c390 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20   savedBusy;.    
1c3a0 61 73 73 65 72 74 28 70 52 65 63 79 63 6c 65 64  assert(pRecycled
1c3b0 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c  ==pPg || rc!=SQL
1c3c0 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28  ITE_OK);.    if(
1c3d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c3e0 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65  {.      /* We've
1c3f0 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f   found a page to
1c400 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70   free. At this p
1c410 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61  oint the page ha
1c420 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a  s been .      **
1c430 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1c440 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c  e page hash-tabl
1c450 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  e, free-list and
1c460 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20   synced-list .  
1c470 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
1c480 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
1c490 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
1c4a0 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
1c4b0 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76   .      ** Remov
1c4c0 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c  e it from this l
1c4d0 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69  ist before freei
1c4e0 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ng..      **.   
1c4f0 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
1c500 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
1c510 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
1c520 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
1c530 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  It .      ** pro
1c540 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e  bably is though.
1c550 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c560 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20  PgHdr *pTmp;.   
1c570 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29     assert( pPg )
1c580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
1c590 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b  =pPager->pAll ){
1c5a0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
1c5b0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
1c5c0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  extAll;.      }e
1c5d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
1c5e0 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70  ( pTmp=pPager->p
1c5f0 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  All; pTmp->pNext
1c600 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70  All!=pPg; pTmp=p
1c610 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
1c620 7d 0a 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e  }.        pTmp->
1c630 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e  pNextAll = pPg->
1c640 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
1c650 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65  }.      nRelease
1c660 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20  d += (.         
1c670 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
1c680 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c690 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a  .          + siz
1c6a0 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1c6b0 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1c6c0 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
1c6d0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20  of(PgHistory) . 
1c6e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f       );.      IO
1c6f0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
1c700 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65  p %d *\n", pPage
1c710 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
1c720 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1c730 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
1c740 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
1c750 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c760 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pPg->pData);.  
1c770 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c780 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
1c790 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
1c7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1c7b0 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
1c7c0 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
1c7d0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1c7e0 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
1c7f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70   ** journal in p
1c800 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20  ager_recycle(). 
1c810 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  The error is not
1c820 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1c830 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65   .      ** calle
1c840 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
1c850 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
1c860 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
1c870 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
1c880 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
1c890 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1c8a0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
1c8b0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
1c8c0 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ase .      ** of
1c8d0 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
1c8e0 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
1c8f0 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
1c900 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
1c910 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c920 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  assert(.        
1c930 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c    (rc&0xff)==SQL
1c940 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
1c950 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
1c960 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
1c970 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42      rc==SQLITE_B
1c980 55 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  USY.      );.   
1c990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c9a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1c9b0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1c9c0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
1c9d0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d  ager, rc);.    }
1c9e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  .  }..  /* Clear
1c9f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61   the memory mana
1ca00 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64  gement flags and
1ca10 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
1ca20 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  ex.  */.  for(pP
1ca30 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65  ager=sqlite3Page
1ca40 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70  rList; pPager; p
1ca50 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
1ca60 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65  ext){.     pPage
1ca70 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
1ca80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1ca90 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
1caa0 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
1cab0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1cac0 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a  tes released.  *
1cad0 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65  /.  return nRele
1cae0 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ased;.}.#endif /
1caf0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1cb00 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1cb10 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  T */../*.** Read
1cb20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1cb30 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1cb40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cb60 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
1cb70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1cb80 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
1cb90 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1cba0 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
1cbb0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
1cbc0 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
1cbd0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
1cbe0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1cbf0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
1cc00 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1cc10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1cc20 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1cc30 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
1cc40 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1cc50 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1cc60 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1cc70 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1cc80 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
1cc90 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1cca0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1ccb0 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  et);.  PAGER_INC
1ccc0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1ccd0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1cce0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1ccf0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1cd00 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1cd10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1cd20 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e  gno));.  if( pgn
1cd30 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  o==1 ){.    memc
1cd40 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1cd50 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50  leVers, &((u8*)P
1cd60 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1cd70 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  ))[24],.        
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
1cdb0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1cdc0 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
1cdd0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
1cde0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
1cdf0 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47  >pgno, 3);.  PAG
1ce00 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20  ERTRACE4("FETCH 
1ce10 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1ce20 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ce30 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1ce40 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1ce50 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1ce60 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74  ash(pPg));.  ret
1ce70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1ce80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ce90 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1cea0 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
1ceb0 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
1cec0 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
1ced0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
1cee0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
1cef0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1cf00 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1cf10 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
1cf20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cf30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1cf40 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1cf50 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
1cf60 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
1cf70 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
1cf80 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
1cf90 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
1cfa0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
1cfb0 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
1cfc0 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
1cfd0 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
1cfe0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
1cff0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d000 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
1d010 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1d020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d030 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20  ;.  int isHot = 
1d040 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
1d050 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1d060 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76  ned for exclusiv
1d070 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f  e access, has no
1d080 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20   outstanding .  
1d090 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ** page referenc
1d0a0 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20  es and is in an 
1d0b0 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
1d0c0 20 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74   is the chance t
1d0d0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
1d0e0 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
1d0f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d100 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1d110 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20  and treat any.  
1d120 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  ** open journal 
1d130 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f  file as a hot-jo
1d140 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
1d150 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1d160 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1d170 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  e && pPager->nRe
1d180 66 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  f==0 && pPager->
1d190 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
1d1a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1d1b0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
1d1c0 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d  isHot = 1;.    }
1d1d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
1d1e0 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
1d1f0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
1d200 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
1d210 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1d220 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e  r is still in an
1d230 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
1d240 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68   not proceed. Th
1d250 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74  e error .  ** st
1d260 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ate will be clea
1d270 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  red at some poin
1d280 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
1d290 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20  when all page . 
1d2a0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61   ** references a
1d2b0 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74  re dropped and t
1d2c0 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  he cache can be 
1d2d0 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a  discarded..  */.
1d2e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d2f0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1d300 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1d310 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1d320 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1d330 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ode;.  }..  if( 
1d340 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1d350 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
1d360 73 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  sHot ){.    sqli
1d370 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1d380 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1d390 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1d3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1d3b0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ager->nRef==0 );
1d3c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
1d3d0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1d3e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1d3f0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1d400 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
1d410 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1d420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1d440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d450 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1d460 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  CK );.          
1d470 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1d480 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1d490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d4a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d4b0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
1d4c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
1d4d0 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
1d4e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
1d4f0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
1d500 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
1d510 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
1d520 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1d530 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
1d540 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
1d550 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
1d560 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
1d570 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
1d580 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1d590 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
1d5a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d5b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1d5c0 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
1d5d0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
1d5e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 31  .      if( rc==1
1d5f0 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20   || isHot ){.   
1d600 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
1d610 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1d620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d630 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
1d640 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20  t it is.        
1d650 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
1d660 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
1d670 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
1d680 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
1d690 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45  the.        ** E
1d6a0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1d6b0 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
1d6c0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
1d6d0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
1d6e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d6f0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
1d700 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
1d710 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
1d720 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
1d730 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
1d740 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
1d750 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
1d760 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
1d770 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e          ** back.
1d780 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
1d790 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
1d7a0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
1d7b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
1d7c0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
1d7d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d7e0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
1d7f0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
1d800 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
1d810 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
1d820 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1d830 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
1d840 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1d850 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1d860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d870 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1d880 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
1d890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1d8a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1d8b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
1d8c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1d8d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d8f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
1d900 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1d910 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
1d920 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
1d930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1d950 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1d960 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
1d970 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
1d980 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1d990 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
1d9a0 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
1d9b0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
1d9c0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
1d9d0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
1d9e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1d9f0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
1da00 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
1da10 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
1da20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
1da30 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
1da40 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
1da50 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
1da60 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
1da70 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
1da80 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
1da90 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
1daa0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
1dab0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
1dac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1dad0 69 66 28 20 21 69 73 48 6f 74 20 26 26 20 70 50  if( !isHot && pP
1dae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1daf0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1db00 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
1db10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1db20 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
1db30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1db40 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1db50 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20  ISTS,&res);.    
1db60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1db70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1db80 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
1db90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dba0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1dbc0 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
1dbd0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1dbe0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1dbf0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
1dc00 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1dc10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1dc30 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1dc40 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1dc50 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1dc60 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1dc80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1dc90 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
1dca0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1dcc0 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  ( fout&SQLITE_OP
1dcd0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1dcf0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1dd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1dd20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1dd40 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1dd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
1dd60 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1dd70 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
1dd80 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65   that means some
1dd90 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1ddb0 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
1ddc0 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1dde0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1ddf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1de00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1de20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1de30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1de40 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
1de50 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1de60 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20  R_UNLOCK .      
1de70 20 20 20 20 20 26 26 20 72 63 21 3d 53 51 4c 49       && rc!=SQLI
1de80 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 0a  TE_IOERR_NOMEM .
1de90 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1dea0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1deb0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1dec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ded0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1dee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1def0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1df00 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
1df10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1df20 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
1df30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1df40 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
1df50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
1df60 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
1df70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1df80 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
1df90 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
1dfa0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
1dfb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
1dfc0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
1dfd0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
1dfe0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
1dff0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1e000 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e010 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1e020 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
1e030 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1e040 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e050 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1e060 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1e070 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1e080 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1e090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e0a0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1e0b0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1e0c0 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
1e0d0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63      (pPager->exc
1e0e0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1e0f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
1e100 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
1e110 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20    );.      }..  
1e120 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e130 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
1e140 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
1e150 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
1e160 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
1e170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1e180 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68         ** and th
1e190 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
1e1a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1e1b0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
1e1c0 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ous.        ** r
1e1d0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1e1e0 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63  nsaction).  Chec
1e1f0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1e200 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20  database.       
1e210 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
1e220 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
1e230 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
1e240 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
1e250 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e         ** cache.
1e260 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1e270 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
1e280 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
1e290 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
1e2a0 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
1e2b0 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ning.        ** 
1e2c0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
1e2d0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
1e2e0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
1e2f0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
1e300 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62         ** a 32-b
1e310 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
1e320 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
1e330 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
1e340 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
1e350 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
1e360 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
1e370 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
1e380 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  ge when.        
1e390 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
1e3a0 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a   use..        **
1e3b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65   .        ** The
1e3c0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1e3d0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1e3e0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1e3f0 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1e400 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1e410 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1e420 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1e430 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1e440 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1e450 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
1e460 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cted..        */
1e470 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62  .        char db
1e480 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
1e490 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e4a0 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  rs)];.        sq
1e4b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1e4c0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  unt(pPager);..  
1e4d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1e4e0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1e4f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
1e500 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1e510 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1e520 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ed;.        }.. 
1e530 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1e540 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
1e550 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1e560 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
1e570 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
1e580 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
1e590 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1e5a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1e5b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1e5c0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1e5d0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1e5e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1e5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e600 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1e610 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
1e620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e630 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
1e640 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
1e650 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
1e660 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
1e670 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1e680 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
1e690 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1e6a0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
1e6b0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
1e6c0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
1e6d0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1e6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e6f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1e700 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
1e710 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1e720 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
1e730 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1e740 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1e750 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1e760 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1e770 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1e780 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
1e790 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
1e7a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e7b0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
1e7c0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
1e7d0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
1e7e0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
1e7f0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
1e800 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
1e810 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1e820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e830 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1e840 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
1e850 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
1e860 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
1e870 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
1e880 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
1e890 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
1e8a0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
1e8b0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
1e8c0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
1e8d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1e8e0 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
1e8f0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1e900 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
1e910 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
1e920 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
1e930 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1e940 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
1e950 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1e960 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
1e970 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1e980 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
1e990 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
1e9a0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
1e9b0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
1e9c0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
1e9d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e9e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
1e9f0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
1ea00 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
1ea10 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1ea20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
1ea30 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
1ea40 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
1ea50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ea60 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1ea70 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
1ea80 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1ea90 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
1eaa0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
1eab0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1eac0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
1ead0 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
1eae0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1eaf0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1eb00 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1eb10 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
1eb20 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
1eb30 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
1eb40 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1eb50 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
1eb60 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
1eb70 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
1eb80 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
1eb90 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
1eba0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
1ebb0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
1ebc0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
1ebd0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
1ebe0 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
1ebf0 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
1ec00 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
1ec10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
1ec20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
1ec30 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1ec40 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
1ec50 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
1ec60 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
1ec70 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
1ec80 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
1ec90 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
1eca0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
1ecb0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1ecc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
1ecd0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
1ece0 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20  nByteHdr;..  /* 
1ecf0 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
1ed00 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
1ed10 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
1ed20 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
1ed30 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f  bove are met: */
1ed40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1ed50 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
1ed60 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
1ed70 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20  ->lru.pFirst==0 
1ed80 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
1ed90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  || (pPager->lru.
1eda0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1edb0 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
1edc0 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 76  Sync).  ){.    v
1edd0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
1ede0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1edf0 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
1ee00 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1ee10 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
1ee20 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
1ee30 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
1ee40 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
1ee50 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
1ee60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1ee70 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
1ee80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ee90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1eea0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1eeb0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
1eec0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1eed0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1eee0 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69     nByteHdr = si
1eef0 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a  zeof(*pPg) + siz
1ef00 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1ef10 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1ef20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1ef30 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1ef40 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  );.    pPg = sql
1ef50 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
1ef60 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66 28  teHdr );.    if(
1ef70 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44   pPg ){.      pD
1ef80 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
1ef90 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
1efa0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1efb0 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1efc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1efd0 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1efe0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
1eff0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1f000 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1f010 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30  ;.    if( pPg==0
1f020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f040 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1f050 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1f060 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
1f070 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a  , 0, nByteHdr);.
1f080 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d      pPg->pData =
1f090 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d   pData;.    pPg-
1f0a0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1f0b0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1f0c0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1f0d0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
1f0e0 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
1f0f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
1f100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f110 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
1f120 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
1f130 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
1f140 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1f150 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1f160 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1f170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1f180 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
1f190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
1f1a0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CKED;.    }.    
1f1b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f1c0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1f1d0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1f1e0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ut;.    }.    as
1f1f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1f200 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
1f210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70   );.    assert(p
1f220 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67  Pg);.  }.  *ppPg
1f230 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61   = pPg;..pager_a
1f240 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72  llocate_out:.  r
1f250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f260 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
1f270 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
1f280 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
1f290 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
1f2a0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1f2b0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1f2c0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
1f2d0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
1f2e0 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
1f2f0 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
1f300 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
1f310 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
1f320 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
1f330 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
1f340 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
1f350 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
1f360 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
1f370 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
1f380 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
1f390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f3a0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1f3b0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1f3c0 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  f( pPg->needRead
1f3d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1f3e0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
1f3f0 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
1f400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1f410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f420 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
1f430 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1f440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1f450 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f460 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1f470 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1f480 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
1f490 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
1f4a0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
1f4b0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
1f4c0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
1f4d0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
1f4e0 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
1f4f0 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
1f500 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
1f510 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
1f520 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f530 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
1f540 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
1f550 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
1f560 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1f570 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
1f580 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1f590 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
1f5a0 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
1f5b0 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
1f5c0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
1f5d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
1f5e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
1f5f0 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
1f600 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
1f610 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
1f620 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
1f630 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
1f640 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
1f650 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
1f660 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
1f670 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
1f680 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
1f690 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
1f6a0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
1f6b0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
1f6c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
1f6d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f6e0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1f6f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
1f700 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
1f710 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
1f720 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
1f730 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
1f740 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
1f750 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
1f760 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
1f770 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
1f780 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
1f790 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
1f7a0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
1f7b0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
1f7c0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
1f7d0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
1f7e0 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
1f7f0 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
1f800 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
1f810 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
1f820 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
1f830 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
1f840 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
1f850 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
1f860 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
1f870 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
1f880 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
1f890 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
1f8a0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
1f8b0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
1f8c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
1f8d0 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
1f8e0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1f8f0 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
1f900 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1f910 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1f920 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
1f930 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
1f940 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1f950 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
1f960 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
1f970 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
1f980 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
1f990 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
1f9a0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
1f9b0 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
1f9c0 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
1f9d0 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
1f9e0 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
1f9f0 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
1fa00 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1fa10 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
1fa20 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
1fa30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1fa40 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1fa50 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68  is page or if th
1fa60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
1fa70 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
1fa80 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c  th noContent==0,
1fa90 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
1faa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
1fab0 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68  needed.** and th
1fac0 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75  e disk read shou
1fad0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
1fae0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
1faf0 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
1fb00 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1fb10 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1fb20 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1fb30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fb40 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1fb60 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1fb70 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1fb80 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1fb90 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1fba0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1fbb0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1fbc0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1fbd0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1fbe0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1fbf0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1fc00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1fc10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1fc20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1fc30 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1fc40 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  || pPager->nRef>
1fc50 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a  0 || pgno==1 );.
1fc60 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
1fc70 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
1fc80 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
1fc90 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1fca0 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
1fcb0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1fcc0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
1fcd0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1fce0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
1fcf0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
1fd00 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
1fd10 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1fd20 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1fd30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1fd40 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1fd50 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
1fd60 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
1fd70 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
1fd80 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1fd90 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1fda0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
1fdb0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1fdc0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
1fdd0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
1fde0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
1fdf0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
1fe00 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
1fe10 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
1fe20 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
1fe30 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
1fe40 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
1fe50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1fe60 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
1fe70 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1fe80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1feb0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1fec0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20  NLOCK );..  pPg 
1fed0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1fee0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1fef0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1ff00 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1ff10 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
1ff20 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1ff30 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  . */.    int nMa
1ff40 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  x;.    int h;.  
1ff50 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1ff60 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
1ff70 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63   rc = pagerAlloc
1ff80 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20  atePage(pPager, 
1ff90 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1ffa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ffb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ffc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
1ffd0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1ffe0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1fff0 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d   || pgno>pPager-
20000 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20  >stmtSize );.   
20010 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
20020 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  = sqlite3BitvecT
20030 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
20040 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
20050 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
20060 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43   = 0;..    makeC
20070 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
20080 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20  Pg->nRef = 1;.. 
20090 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
200a0 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
200b0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
200c0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
200d0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
200e0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
200f0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
20100 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
20110 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
20120 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
20130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20140 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Code ){.      rc
20150 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
20160 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  de;.      sqlite
20170 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
20180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
20190 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
201a0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
201b0 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
201c0 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
201d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
201e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
201f0 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
20200 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
20210 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
20220 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
20230 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
20240 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
20250 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
20260 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
20270 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
20280 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
20290 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
202a0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
202b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
202c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
202d0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
202e0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
202f0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
20300 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
20310 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
20320 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
20330 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
20340 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
20350 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
20360 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
20370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20380 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
20390 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
203a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
203b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
203c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
203d0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
203e0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
203f0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
20400 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20410 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
20420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
20430 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
20440 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
20450 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
20460 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
20470 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
20480 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
20490 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
204a0 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
204b0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
204c0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
204d0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
204e0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
204f0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
20500 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
20510 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
20520 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
20530 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
20540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
20550 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
20560 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
20570 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
20580 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
20590 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
205a0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
205b0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
205c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
205d0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
205e0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
205f0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
20600 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
20610 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
20620 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
20630 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
20640 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
20650 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
20660 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
20670 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
20680 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
20690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
206a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
206b0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
206c0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
206d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
206e0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
206f0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
20700 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20710 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
20720 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
20730 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20740 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
20750 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
20760 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
20770 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
20780 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
20790 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
207a0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
207b0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
207c0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
207d0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
207e0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
207f0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
20800 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
20810 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
20820 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
20830 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
20840 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
20850 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  t);.  pagerLeave
20860 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
20870 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
20880 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
20890 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
208a0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
208b0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
208c0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
208d0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
208e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
208f0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
20900 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
20910 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
20920 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
20930 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
20940 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
20950 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
20960 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
20970 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
20980 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
20990 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
209a0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
209b0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
209c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
209d0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
209e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
209f0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
20a00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
20a10 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
20a20 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
20a30 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
20a40 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
20a50 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
20a60 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
20a70 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
20a80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
20a90 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
20aa0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20ab0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
20ac0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
20ad0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
20ae0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20af0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
20b00 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
20b10 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
20b20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
20b30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
20b40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
20b50 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
20b60 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
20b70 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
20b80 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ing */.  }else i
20b90 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f  f( (pPg = pager_
20ba0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
20bb0 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gno))!=0 ){.    
20bc0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
20bd0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
20be0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
20bf0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
20c00 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
20c10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
20c20 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
20c30 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
20c40 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
20c50 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
20c60 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
20c70 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
20c80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
20c90 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
20ca0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
20cb0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
20cc0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
20cd0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
20ce0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
20cf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20d00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
20d10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
20d20 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
20d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20d40 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67  ;.  pPager = pPg
20d50 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
20d60 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
20d70 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
20d80 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
20d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
20da0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67 65  nRef>0 );.  page
20db0 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
20dc0 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  er);.  pPg->nRef
20dd0 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  --;..  CHECK_PAG
20de0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
20df0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
20e00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
20e10 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
20e20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
20e30 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
20e40 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
20e50 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
20e60 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
20e70 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73  0 ){..    lruLis
20e80 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20 69  tAdd(pPg);.    i
20e90 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
20ea0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
20eb0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
20ec0 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
20ed0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
20ee0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
20ef0 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
20f00 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
20f10 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
20f20 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
20f30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
20f50 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
20f60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20f70 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
20f80 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
20f90 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
20fa0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
20fb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20fc0 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
20fd0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
20fe0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
20ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
21000 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
21010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21020 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
21030 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
21040 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
21050 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
21060 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
21070 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
21080 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
21090 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
210a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
210b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
210c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
210d0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
210e0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
210f0 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
21100 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
21110 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
21120 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
21130 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
21140 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
21150 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
21160 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
21170 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
21180 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  .  int flags = (
21190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
211a0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
211b0 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
211c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
211d0 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ..  int rc;.  as
211e0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
211f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21200 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
21210 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
21220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
21230 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
21240 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
21250 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
21260 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
21270 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
21280 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
21290 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er);.  pPager->p
212a0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
212b0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
212c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
212d0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
212e0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
212f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
21300 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
21310 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21320 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
21330 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
21340 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
21350 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
21360 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
21370 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
21380 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
21390 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
213a0 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
213b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
213c0 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  L);.    }else{. 
213d0 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
213e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
213f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
21400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21410 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
21420 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  E.    rc = sqlit
21430 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
21440 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
21450 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
21460 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
21470 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
21480 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  e(pPager).    );
21490 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
214a0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
214b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
214c0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
214d0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
214e0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
214f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
21500 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
21510 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70  Methods );.    p
21520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21530 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
21540 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
21550 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
21560 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
21570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
215a0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M ){.        sql
215b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
215c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
215d0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
215e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
215f0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
21600 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  al;.    }.  }.  
21610 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21620 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
21630 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
21640 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
21650 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
21660 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
21670 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
21680 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
21690 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
216a0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
216b0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
216c0 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
216d0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
216e0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
216f0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21700 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21710 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
21720 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
21730 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
21740 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
21750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21760 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21770 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
21780 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
21790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
217a0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
217b0 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
217c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
217d0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
217e0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
217f0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
21800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21820 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
21830 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21840 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
21850 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
21860 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21870 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
21880 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
21890 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
218a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
218b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
218c0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
218d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
218e0 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
218f0 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
21900 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
21910 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
21920 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
21930 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
21940 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  Two() is called.
21950 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
21960 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
21970 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
21980 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
21990 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
219a0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
219b0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
219c0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
219d0 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
219e0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
219f0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
21a00 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
21a10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
21a20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
21a30 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
21a40 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
21a50 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
21a60 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
21a70 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
21a80 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
21a90 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
21aa0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
21ab0 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
21ac0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
21ad0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
21ae0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
21af0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
21b00 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
21b10 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
21b20 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
21b30 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
21b40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
21b50 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
21b60 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
21b70 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
21b80 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
21b90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
21ba0 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
21bb0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
21bc0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
21bd0 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
21be0 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
21bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21c00 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
21c10 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
21c20 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
21c30 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
21c40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
21c50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
21c60 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
21c70 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
21c80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
21c90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  o-op..**.** If e
21ca0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67  xFlag is true, g
21cb0 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20  o ahead and get 
21cc0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
21cd0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  k on the file.**
21ce0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73   immediately ins
21cf0 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20  tead of waiting 
21d00 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20  until we try to 
21d10 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
21d20 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20    The.** exFlag 
21d30 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20  is ignored if a 
21d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
21d50 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
21d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21d70 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a  erBegin(DbPage *
21d80 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  pPg, int exFlag)
21d90 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
21da0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
21db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21dc0 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e  TE_OK;.  pagerEn
21dd0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
21de0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
21df0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
21e00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
21e10 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
21e20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21e30 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
21e40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21e50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21e60 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
21e70 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
21e80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
21e90 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
21ea0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
21eb0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
21ec0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
21ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
21ee0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
21ef0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
21f00 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
21f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
21f30 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
21f40 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
21f50 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
21f60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
21f70 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
21f80 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
21f90 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
21fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21fb0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
21fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21fd0 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28       pagerLeave(
21fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
21ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22000 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
22010 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
22020 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
22030 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
22040 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
22050 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
22060 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
22070 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
22080 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 20  r->tempFile.    
22090 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
220a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
220b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
220c0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
220d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
220e0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
220f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22100 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
22110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
22120 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22130 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
22140 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
22150 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
22160 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
22170 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
22180 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
22190 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
221a0 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
221b0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
221c0 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
221d0 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
221e0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
221f0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
22200 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
22210 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
22220 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77  pen and either w
22230 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
22240 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68  0 bytes or its h
22250 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a  eader was.    **
22260 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
22270 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
22280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22290 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
222a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
222b0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
222c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
222d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
222e0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  al==0 );.    sql
222f0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
22300 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
22310 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
22320 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
22330 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
22340 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
22350 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
22360 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74   );.    pagerEnt
22370 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
22380 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e  if( !pPager->pIn
22390 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
223a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
223b0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
223c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
223d0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
223e0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
223f0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
22400 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
22410 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
22420 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
22430 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
22440 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
22450 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
22460 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
22470 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
22480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
22490 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
224a0 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
224b0 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
224c0 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
224d0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
224e0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
224f0 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
22500 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
22510 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
22520 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22530 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
22540 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
22550 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
22560 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
22570 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22580 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
22590 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
225a0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
225b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
225c0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
225d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
225e0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
225f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
22600 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
22610 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
22620 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
22630 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
22640 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
22650 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
22660 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
22670 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
22680 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
22690 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
226a0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
226b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
226c0 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
226d0 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
226e0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d      pPg->pDirty-
226f0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
22700 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20  g->pPrevDirty;. 
22710 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
22720 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a  ->pPrevDirty ){.
22730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
22740 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
22750 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20  Dirty==pPg );.  
22760 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
22770 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
22780 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
22790 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
227a0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
227b0 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a  >pDirty==pPg );.
227c0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
227d0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
227e0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
227f0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
22800 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
22810 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
22820 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
22830 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
22840 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
22850 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
22860 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22870 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
22880 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
22890 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
228a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
228b0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
228c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
228d0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
228e0 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
228f0 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
22900 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22910 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
22920 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
22930 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
22940 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
22950 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22960 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
22970 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
22980 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
22990 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
229a0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
229b0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
229c0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
229d0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
229e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
229f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
22a00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
22a10 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
22a20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
22a30 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
22a40 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
22a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22a60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
22a70 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
22a80 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
22a90 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
22aa0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
22ab0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
22ac0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
22ad0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
22ae0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
22af0 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
22b00 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
22b10 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
22b20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
22b30 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
22b40 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
22b50 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
22b60 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
22b70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
22b80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
22b90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22ba0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
22bb0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
22bc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
22bd0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
22be0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
22bf0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
22c00 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
22c10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22c20 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
22c30 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
22c40 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
22c50 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
22c60 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
22c70 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
22c80 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
22c90 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
22ca0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
22cb0 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
22cc0 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
22cd0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
22ce0 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
22cf0 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
22d00 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
22d10 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
22d20 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
22d30 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
22d40 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
22d50 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
22d60 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
22d70 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
22d80 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
22d90 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
22da0 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
22db0 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
22dc0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
22dd0 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
22de0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
22df0 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
22e00 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
22e10 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
22e20 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
22e30 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
22e40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22e50 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
22e60 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
22e70 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
22e80 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
22e90 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
22ea0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
22eb0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
22ec0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
22ed0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
22ee0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
22ef0 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
22f00 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
22f10 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
22f20 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
22f30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
22f40 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
22f50 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
22f60 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
22f70 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
22f80 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
22f90 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
22fa0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
22fb0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
22fc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22fd0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
22fe0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
22ff0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
23000 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
23010 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
23020 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
23030 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
23040 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
23050 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
23060 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
23070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23080 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
23090 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
230a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
230b0 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
230c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
230d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
230e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
230f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23100 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
23110 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
23120 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
23130 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
23140 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  er->useJournal. 
23150 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
23160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
23170 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
23180 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
23190 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
231a0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
231b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
231c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
231d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
231e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
231f0 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  he = 1;.    pPag
23200 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
23210 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
23220 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
23230 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
23240 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
23250 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
23260 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
23270 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
23280 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
23290 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
232a0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
232b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
232c0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
232d0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
232e0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
232f0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
23300 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
23310 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d  journalOpen || M
23320 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
23330 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
23340 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
23350 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
23360 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
23370 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
23380 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
23390 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
233a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
233b0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
233c0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
233d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
233e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
233f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
23400 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
23410 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
23420 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
23430 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
23440 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
23450 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
23460 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  if( !pHist->pOri
23470 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
23480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23490 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
234a0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
234b0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
234c0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
234d0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
234e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
234f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23500 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
23510 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
23520 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  a2;..          /
23530 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
23540 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
23550 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
23560 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
23570 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
23580 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
23590 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
235a0 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
235b0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
235c0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
235d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
235e0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
235f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
23600 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
23610 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
23620 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
23630 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
23640 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
23650 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
23660 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
23670 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  a2);.          r
23680 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
23690 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
236a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
236b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
236c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
236d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
236e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
236f0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
23700 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
23710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23720 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
23750 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
23760 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23770 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
23780 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
23790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
237a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
237b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
237c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
237d0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
237e0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
237f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
23800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
23810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23820 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
23830 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f    }.          IO
23840 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
23850 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
23860 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
23870 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
23880 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
23890 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
238a0 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
238b0 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
238c0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
238d0 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
238e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
238f0 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE5("JOURNAL %
23900 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
23910 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
23920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23930 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
23940 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
23950 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
23960 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
23970 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  g));..          
23980 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
23990 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
239a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
239b0 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
239c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
239d0 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
239e0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
239f0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
23a00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23a30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23a40 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
23a50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
23a60 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
23a70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
23a80 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
23a90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23aa0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
23ab0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
23ac0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
23ad0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
23ae0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
23af0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
23b00 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
23b10 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
23b20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
23b30 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
23b40 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
23b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
23b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
23b80 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
23b90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
23ba0 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
23bb0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
23bc0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
23bd0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
23be0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
23bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23c10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
23c20 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
23c30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23c40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
23c50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23c60 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
23c70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
23c80 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
23c90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
23ca0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
23cb0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
23cc0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
23cd0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
23ce0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
23cf0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
23d00 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
23d10 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
23d20 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
23d30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
23d40 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
23d50 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
23d60 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
23d70 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
23d80 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
23d90 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
23da0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
23db0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
23dc0 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
23dd0 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
23de0 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
23df0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
23e00 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
23e10 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
23e20 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
23e30 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
23e40 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
23e50 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
23e60 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
23e70 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
23e80 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
23e90 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
23ea0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
23eb0 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
23ec0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
23ed0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
23ee0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
23ef0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
23f00 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
23f10 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
23f20 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
23f30 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
23f40 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
23f50 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
23f60 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
23f70 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
23f80 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
23f90 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
23fa0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
23fb0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
23fc0 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
23fd0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
23fe0 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
23ff0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66  .        i64 off
24000 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
24010 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
24020 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
24030 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
24040 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
24050 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
24060 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
24070 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
24080 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  s(pPager->stfd, 
24090 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
240a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
240b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
240c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
240d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
240e0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
240f0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
24100 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
24110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24120 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
24130 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
24140 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
24150 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
24160 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
24170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
24190 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
241a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
241b0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
241c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
241d0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
241e0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
241f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
24200 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
24210 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
24220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24230 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
24240 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
24250 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
24260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24270 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
24280 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
24290 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
242a0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
242b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
242c0 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
242d0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
242e0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
242f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
24300 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
24310 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
24320 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
24330 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24350 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24360 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
24370 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
24380 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
24390 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
243a0 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
243b0 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
243c0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
243d0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
243e0 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
243f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
24400 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
24410 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
24420 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
24430 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
24440 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
24450 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
24460 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
24470 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
24480 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
24490 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
244a0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
244b0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
244c0 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
244d0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
244e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
244f0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
24500 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
24510 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
24520 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
24530 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
24540 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24550 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
24560 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
24570 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
24580 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
24590 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
245a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
245b0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
245c0 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  e);..  pagerEnte
245d0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
245e0 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
245f0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
24600 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
24610 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
24620 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
24630 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
24640 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
24650 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
24660 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24670 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
24680 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
24690 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
246a0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
246b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
246c0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
246d0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
246e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
246f0 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65   ii;.    int nee
24700 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
24710 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
24720 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
24730 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
24740 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
24750 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
24760 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
24770 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
24780 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
24790 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
247a0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
247b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
247c0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
247d0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
247e0 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
247f0 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
24800 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
24810 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
24820 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
24830 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
24840 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
24850 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
24860 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
24870 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
24880 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
24890 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
248a0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
248b0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
248c0 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
248d0 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
248e0 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
248f0 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71   nPageCount = sq
24900 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
24910 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
24920 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
24930 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
24940 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
24950 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
24960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
24970 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
24980 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
24990 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
249a0 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
249b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
249c0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
249d0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
249e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
249f0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
24a00 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
24a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
24a20 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
24a30 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
24a40 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
24a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
24a60 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
24a70 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
24a80 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
24a90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
24aa0 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
24ab0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
24ac0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
24ad0 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
24ae0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
24af0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
24b00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
24b10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24b20 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
24b30 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
24b40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24b60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
24b70 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
24b80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
24b90 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ge->needSync ){.
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
24bb0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
24bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24be0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
24bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24c00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
24c10 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
24c20 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
24c30 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
24c40 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
24c50 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
24c60 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
24c70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
24c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
24c90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48     /* If the PgH
24ca0 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
24cb0 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
24cc0 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
24cd0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
24ce0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
24cf0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
24d00 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
24d10 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
24d20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
24d30 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
24d40 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
24d50 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
24d60 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
24d70 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
24d80 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
24d90 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
24da0 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
24db0 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
24dc0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
24dd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24de0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
24df0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b   if( needSync ){
24e00 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
24e10 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65   ii<nPage && nee
24e20 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  dSync; ii++){.  
24e30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
24e40 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
24e50 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
24e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
24e70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e 65  Page ) pPage->ne
24e80 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
24e90 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
24ea0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
24eb0 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
24ec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24ed0 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
24ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
24ef0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
24f00 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
24f10 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
24f20 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
24f30 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
24f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24f50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
24f60 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
24f70 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
24f80 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
24f90 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
24fa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
24fb0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
24fc0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
24fd0 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
24fe0 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
24ff0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
25000 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
25010 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
25020 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
25030 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
25040 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
25050 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
25060 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
25070 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
25080 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
25090 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
250a0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
250b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
250c0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
250d0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
250e0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
250f0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
25100 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
25110 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
25120 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
25130 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
25140 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
25150 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
25160 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
25170 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
25180 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
25190 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
251a0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
251b0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
251c0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
251d0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
251e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
251f0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
25200 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
25210 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
25220 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
25230 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
25240 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
25250 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
25260 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
25270 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
25280 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
25290 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
252a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
252b0 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
252c0 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
252d0 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
252e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
252f0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
25300 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
25310 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
25320 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
25330 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
25340 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
25350 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
25360 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
25370 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
25380 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
25390 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
253a0 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
253b0 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
253c0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
253d0 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
253e0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
253f0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
25400 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
25410 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
25420 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
25430 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
25440 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
25450 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
25460 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
25470 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
25480 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
25490 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
254a0 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
254b0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
254c0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
254d0 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
254e0 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
254f0 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
25500 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
25510 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
25520 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
25530 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
25540 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25550 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
25560 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
25570 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
25580 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
25590 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
255a0 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
255b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67   ) return;.  pag
255c0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
255d0 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
255e0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
255f0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20  ( pPg->dirty && 
25600 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
25610 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
25620 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
25630 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
25640 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
25650 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
25660 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
25670 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
25680 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
25690 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
256a0 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
256b0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
256c0 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
256d0 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
256e0 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
256f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
25700 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
25710 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
25720 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
25730 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
25740 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
25750 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
25760 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
25770 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
25780 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
25790 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
257a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
257b0 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
257c0 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
257d0 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
257e0 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
257f0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
25800 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
25810 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
25820 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
25830 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
25840 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
25850 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
25860 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
25870 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
25880 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
25890 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
258a0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
258b0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
258c0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
258d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
258e0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
258f0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
25900 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
25910 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
25920 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
25930 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
25940 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
25950 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
25960 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
25970 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
25980 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
25990 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
259a0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
259b0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
259c0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
259d0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
259e0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
259f0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
25a00 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
25a10 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
25a20 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
25a30 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
25a40 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
25a50 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
25a60 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
25a70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
25a80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61  ..**.** If we ha
25a90 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61  ve not yet actua
25aa0 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e  lly read the con
25ab0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  tent of this pag
25ac0 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48  e (if.** the PgH
25ad0 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
25ae0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68   is set) then th
25af0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
25b00 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20  as a promise.** 
25b10 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76  that we will nev
25b20 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20  er need to read 
25b30 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
25b40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
25b50 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65  ** so the needRe
25b60 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63  ad flag can be c
25b70 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70  leared at this p
25b80 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oint..*/.void sq
25b90 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25ba0 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70  llback(DbPage *p
25bb0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
25bc0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
25bd0 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  er;..  pagerEnte
25be0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
25bf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25c00 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
25c10 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ED );..  /* If t
25c20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25c30 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
25c40 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
25c50 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20  been called on. 
25c60 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28 44   ** this page (D
25c70 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73 20  ontWrite() sets 
25c80 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
25c90 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74  ck flag), then t
25ca0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
25cb0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  n is a no-op..  
25cc0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
25cd0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
25ce0 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  || pPg->alwaysRo
25cf0 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
25d00 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
25d10 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65 61   ){.    pagerLea
25d20 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
25d30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
25d40 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 20  sert( !MEMDB ); 
25d50 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d 64     /* For a memd
25d60 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  b, pPager->journ
25d70 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79 73  alOpen is always
25d80 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   0 */..#ifdef SQ
25d90 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
25da0 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  TE.  if( pPg->in
25db0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
25dc0 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61 67  pPg->pgno > pPag
25dd0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
25de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
25df0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
25e00 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  f SECURE_DELETE 
25e10 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
25e20 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  n there is no wa
25e30 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
25e40 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
25e50 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
25e60 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74   for which sqlit
25e70 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
25e80 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  ().  ** has not 
25e90 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
25ea0 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68  called during th
25eb0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
25ec0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  on..  ** And if 
25ed0 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
25ee0 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20  previously been 
25ef0 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c  called, the foll
25f00 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69  owing.  ** condi
25f10 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
25f20 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
25f30 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
25f40 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
25f50 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
25f60 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20 20  rigDbSize );..  
25f70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25f80 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
25f90 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
25fa0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
25fb0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
25fc0 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  o);.  pPg->inJou
25fd0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67 2d  rnal = 1;.  pPg-
25fe0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
25ff0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
26000 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
26010 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26020 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  mtSize >= pPager
26030 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
26040 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
26050 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
26060 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
26070 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
26080 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
26090 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
260a0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
260b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
260c0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41  ;.  IOTRACE(("GA
260d0 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
260e0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
260f0 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76 65  o)).  pagerLeave
26100 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
26110 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26120 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
26130 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
26140 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
26150 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
26160 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
26170 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
26180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26190 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
261a0 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
261b0 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
261c0 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  rect){.  PgHdr *
261d0 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
261e0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
261f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26200 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  OK;..  if( !pPag
26210 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
26220 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  one ){.    /* Op
26230 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
26240 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
26250 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
26260 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
26270 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
26280 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
26290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
262a0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
262b0 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
262c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
262d0 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
262e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
262f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26300 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
26310 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
26320 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26330 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
26340 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
26350 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
26360 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
26370 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
26380 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
26390 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
263a0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
263b0 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
263c0 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e  eVers);.    chan
263d0 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
263e0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
263f0 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
26400 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63  A(pPgHdr))+24, c
26410 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
26420 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
26430 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
26440 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
26450 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
26460 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  Buf = PGHDR_TO_D
26470 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ATA(pPgHdr);.   
26480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26490 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
264a0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
264b0 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
264c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
264d0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
264e0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
264f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26500 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
26510 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
26520 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
26530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26540 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
26550 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
26560 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
26570 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
26580 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26590 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
265a0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
265b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
265c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
265d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
265e0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
265f0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
26600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
26610 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
26620 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
26630 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
26640 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
26650 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
26660 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
26670 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
26680 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
26690 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
266a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
266b0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
266c0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
266d0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
266e0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
266f0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
26700 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
26710 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
26720 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
26730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
26740 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
26750 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
26760 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
26770 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
26780 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
26790 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
267a0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
267b0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
267c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
267d0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
267e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
267f0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
26800 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
26810 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
26820 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
26830 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
26840 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
26850 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
26860 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
26870 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
26880 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
26890 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
268a0 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
268b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
268c0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
268d0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
268e0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
268f0 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
26900 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
26910 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  bases)..**.** If
26920 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
26930 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
26940 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
26950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26960 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
26970 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
26980 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
26990 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
269a0 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
269b0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
269c0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
269d0 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
269e0 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
269f0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
26a00 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
26a10 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
26a20 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
26a30 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
26a40 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  Pager, .  const 
26a50 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a  char *zMaster, .
26a60 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20    Pgno nTrunc,. 
26a70 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20   int noSync.){. 
26a80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26a90 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
26aa0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
26ab0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
26ac0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
26ad0 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67    /* If no chang
26ae0 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
26af0 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20  e, we can leave 
26b00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
26b10 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  early..  */.  if
26b20 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  ( pPager->dbModi
26b30 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20  fied==0 &&.     
26b40 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72     (pPager->jour
26b50 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
26b60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
26b70 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
26b80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
26b90 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20  Mode!=0) ){.    
26ba0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26bb0 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
26bc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26bd0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Open==0 );.    r
26be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26bf0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
26c00 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
26c10 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
26c20 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
26c30 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
26c40 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
26c50 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
26c60 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
26c70 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ager);..  /* If 
26c80 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
26c90 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
26ca0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
26cb0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
26cc0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
26cd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26ce0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
26cf0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
26d00 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
26d10 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
26d20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
26d30 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
26d40 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
26d50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
26d60 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
26d70 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65  WRITE.    /* The
26d80 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
26d90 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
26da0 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66  e used if all of
26db0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   the.    ** foll
26dc0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
26dd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
26de0 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   + The file-syst
26df0 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
26e00 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
26e10 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a  perty for.    **
26e20 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
26e30 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
26e40 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  and.    **    + 
26e50 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
26e60 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
26e70 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
26e80 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ion, and.    ** 
26e90 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65     + Exactly one
26ea0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
26eb0 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
26ec0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
26ed0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
26ee0 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
26ef0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
26f00 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a  used, then the j
26f10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
26f20 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65   never.    ** be
26f30 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
26f40 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
26f50 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73     */.    int us
26f60 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28  eAtomicWrite = (
26f70 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65  .        !zMaste
26f80 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  r && .        pP
26f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
26fa0 6e 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  n &&.        pPa
26fb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
26fc0 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
26fd0 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20  pPager) && .    
26fe0 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26      nTrunc==0 &&
26ff0 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50   .        (0==pP
27000 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20  ager->pDirty || 
27010 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  0==pPager->pDirt
27020 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  y->pDirty).    )
27030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
27050 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
27060 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
27070 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
27080 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74  );.    if( useAt
27090 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20  omicWrite ){.   
270a0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
270b0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
270c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
270d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
270e0 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
270f0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
27100 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
27110 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27120 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
27130 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
27140 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
27150 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
27160 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
27170 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
27180 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
27190 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
271a0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
271b0 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
271c0 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
271d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
271e0 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
271f0 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
27200 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
27210 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
27220 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
27230 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
27240 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
27250 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
27260 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
27270 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
27280 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
27290 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
272a0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
272b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
272c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
272d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
272e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
272f0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29  unter(pPager, 1)
27300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
27310 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
27320 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
27330 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
27340 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
27350 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74  ( !useAtomicWrit
27360 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
27370 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20  OK ).#endif..   
27380 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
27390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
273a0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
273b0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
273c0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
273d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
273e0 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
273f0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
27400 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
27410 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
27420 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
27430 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
27440 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
27450 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
27460 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
27470 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
27480 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
27490 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
274a0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
274b0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
274c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
274d0 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
274e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
274f0 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
27500 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
27510 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
27520 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
27530 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27540 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
27550 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xit;.      if( p
27560 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27570 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
27580 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66  LMODE_OFF ){.#if
27590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
275a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
275b0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
275c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
275d0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
275e0 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
275f0 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
27600 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
27610 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ges.          **
27620 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
27630 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
27640 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
27650 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
27660 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  l.          ** f
27670 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
27680 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  /.          Pgno
27690 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
276a0 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
276b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
276c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
276d0 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
276e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
276f0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
27700 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
27710 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
27720 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
27730 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
27740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27760 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
27770 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
27780 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27790 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
277a0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
277b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
277c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
277d0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
277e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
277f0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
27800 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
27810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
27820 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
27830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27840 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20       } .        
27850 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
27860 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
27870 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
27880 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
27890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
278a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
278b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72  _exit;.        r
278c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
278d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
278e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
278f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27900 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
27910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27920 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27930 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
27940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27950 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27960 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
27970 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
27980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27990 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
279a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
279b0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
279c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
279d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
279e0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
279f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
27a00 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
27a10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
27a20 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
27a30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27a50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
27a60 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
27a70 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ED );.      /* T
27a80 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68  he error might h
27a90 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72  ave left the dir
27aa0 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c  ty list all foul
27ab0 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20  ed up here,.    
27ac0 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f    ** but that do
27ad0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65  es not matter be
27ae0 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20  cause if the if 
27af0 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64  the dirty list d
27b00 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20  id.      ** get 
27b10 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
27b20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
27b30 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61  will roll back a
27b40 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63  nd.      ** disc
27b50 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69  ard the dirty li
27b60 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  st.  There is an
27b70 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20   assert in.     
27b80 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c   ** pager_get_al
27b90 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20  l_dirty_pages() 
27ba0 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68  that verifies th
27bb0 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20  at no attempt.  
27bc0 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74      ** is made t
27bd0 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64  o use an invalid
27be0 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20   dirty list..   
27bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f     */.      goto
27c00 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
27c10 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
27c20 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  irty = 0;..    /
27c30 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
27c40 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
27c50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27c60 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
27c70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
27c80 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
27c90 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
27ca0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
27cb0 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
27cc0 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
27cd0 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
27ce0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27cf0 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
27d00 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
27d10 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
27d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27d30 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
27d40 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
27d50 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66  .sync_exit:.  if
27d60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
27d70 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  RR_BLOCKED ){.  
27d80 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    /* pager_incr_
27d90 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
27da0 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  may attempt to o
27db0 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
27dc0 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74  ve.     * lock t
27dd0 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  o spill the cach
27de0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45  e and return IOE
27df0 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20  RR_BLOCKED. But 
27e00 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68  since .     * th
27e10 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
27e20 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   the cache is in
27e30 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69  consistent, it i
27e40 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20  s.     * better 
27e50 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
27e60 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20  _BUSY..     */. 
27e70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
27e80 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  USY;.  }.  pager
27e90 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
27ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
27eb0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
27ec0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
27ed0 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
27ee0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
27ef0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
27f00 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
27f10 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
27f20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
27f30 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
27f40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
27f50 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
27f60 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
27f70 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
27f80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
27f90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27fa0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
27fb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27fc0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
27fd0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
27fe0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
27ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
28000 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28010 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
28020 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
28030 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
28040 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
28050 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
28060 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
28070 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
28080 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
28090 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
280a0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
280b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
280c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
280d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
280e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
280f0 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
28100 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
28110 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
28130 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
28140 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
28150 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
28160 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28170 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
28180 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
28190 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
281a0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
281b0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
281c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
281d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
281e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
281f0 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
28200 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
28210 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
28220 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
28230 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
28240 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
28250 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
28260 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
28270 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
28280 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
28290 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
282a0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
282b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
282c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
282d0 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
282e0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
282f0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
28300 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
28310 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
28320 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
28330 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
28340 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
28350 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
28360 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
28370 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
28380 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
28390 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
283a0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
283b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
283c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
283d0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
283e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
283f0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67  _SHARED;.    pag
28400 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28410 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28420 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
28430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
28440 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
28450 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
28460 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
28470 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
28480 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
28490 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
284a0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
284b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
284c0 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
284d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
284e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
284f0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
28500 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
28510 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
28520 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
28530 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
28540 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
28550 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
28560 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
28570 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
28580 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
28590 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
285a0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
285b0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
285c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
285d0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
285e0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
285f0 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
28600 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
28610 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
28620 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
28630 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
28640 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
28650 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
28660 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
28670 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
28680 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
28690 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
286a0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
286b0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
286c0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
286d0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
286e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
286f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
28700 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
28710 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28720 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
28730 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
28740 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
28750 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
28760 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
28770 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
28780 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
28790 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
287a0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
287b0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
287c0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
287d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
287e0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
287f0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
28800 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
28810 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
28820 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
28830 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
28840 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
28850 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
28860 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
28870 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
28880 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28890 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
288a0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
288b0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
288c0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
288d0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
288e0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
288f0 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
28900 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
28910 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28920 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
28930 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
28940 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
28950 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
28960 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
28970 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
28980 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
28990 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
289a0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
289b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
289c0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
289d0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
289e0 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
289f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
28a00 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
28a10 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
28a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
28a30 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
28a40 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
28a50 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
28a60 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
28a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
28a80 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c  er->xReiniter(p,
28a90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28aa0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
28ab0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
28ac0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
28ad0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
28ae0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
28af0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
28b00 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61  igDbSize;.    pa
28b10 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
28b20 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
28b30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28b40 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
28b50 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
28b60 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
28b70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28b80 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72   }..  pagerEnter
28b90 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28ba0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
28bb0 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
28bc0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
28bd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
28be0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
28bf0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
28c00 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 70 61  tMaster);.    pa
28c10 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
28c30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
28c40 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
28c50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
28c60 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
28c70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
28c80 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
28c90 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
28ca0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
28cb0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
28cc0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
28cd0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
28ce0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
28cf0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
28d00 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
28d10 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
28d20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
28d30 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
28d40 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
28d50 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
28d60 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
28d70 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28d80 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
28d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28da0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
28db0 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
28dc0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
28dd0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
28de0 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a  er, 0);.  }.  /*
28df0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
28e00 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65  ger); */.  pPage
28e10 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
28e20 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
28e30 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
28e40 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
28e50 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
28e60 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  st the pager.  *
28e70 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
28e80 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
28e90 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
28ea0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
28eb0 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74  .  ** persistent
28ec0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
28ed0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28ee0 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65  , rc);.  pagerLe
28ef0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
28f00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28f10 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
28f20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28f30 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
28f40 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
28f50 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
28f60 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
28f70 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
28f80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28f90 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
28fa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28fb0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
28fc0 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
28fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28fe0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
28ff0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
29000 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
29010 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
29020 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29030 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
29040 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRef;.}..#ifdef 
29050 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
29060 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
29070 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
29080 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
29090 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
290a0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
290b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
290c0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
290d0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
290e0 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
290f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
29100 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
29110 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
29120 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
29130 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
29140 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
29150 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
29160 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20  rCode;.  a[6] = 
29170 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
29180 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
29190 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30  Miss;.  a[8] = 0
291a0 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65  ;  /* Used to be
291b0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a   pPager->nOvfl *
291c0 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  /.  a[9] = pPage
291d0 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
291e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
291f0 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
29200 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
29210 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
29220 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29230 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64  rn MEMDB;.}.#end
29240 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  if../*.** Set th
29250 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
29260 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
29270 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
29280 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
29290 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
292a0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
292b0 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
292c0 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
292d0 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
292e0 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
292f0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
29300 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
29310 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
29320 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
29330 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
29340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
29350 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
29360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
29370 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
29380 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
29390 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
293a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
293b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
293c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
293d0 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
293e0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
293f0 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
29400 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
29410 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
29420 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
29430 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
29440 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
29450 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29460 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29470 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
29480 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
29490 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
294a0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
294b0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
294c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
294d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
294e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
294f0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
29500 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
29510 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
29520 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  mt==0 );.  pPage
29530 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->pInStmt = sql
29540 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
29550 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
29560 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
29570 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
29580 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30  ager->pInStmt==0
29590 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
295a0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
295b0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
295c0 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
295d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
295e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
295f0 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
29600 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
29610 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
29620 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29630 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
29640 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
29650 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
29660 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
29670 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
29680 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
29690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
296a0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
296b0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
296c0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
296d0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
296e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
296f0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
29700 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
29710 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
29720 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
29730 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
29740 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
29750 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
29760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29770 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
29780 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
29790 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29  Pager->pInStmt )
297a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
297b0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
297c0 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
297d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
297e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
297f0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
29800 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
29810 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
29820 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
29830 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
29840 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  );.  rc = pagerS
29850 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
29860 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
29870 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
29880 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
29890 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
298a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
298b0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
298c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
298d0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
298e0 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
298f0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
29900 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
29910 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47   *pNext;.    PAG
29920 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43  ERTRACE2("STMT-C
29930 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
29940 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
29950 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
29960 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
29970 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
29980 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
29990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
299a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
299b0 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
299c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53      pPager->pInS
299d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
299e0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
299f0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
29a00 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
29a10 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
29a20 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
29a30 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
29a40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29a50 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
29a60 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
29a70 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
29a80 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
29a90 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
29aa0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
29ab0 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
29ac0 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
29ad0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
29ae0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
29af0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
29b00 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
29b10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
29b20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
29b30 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
29b40 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
29b50 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
29b60 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
29b70 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
29b80 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
29b90 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29ba0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
29bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29bc0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
29bd0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
29be0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
29bf0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
29c00 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
29c10 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
29c20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
29c30 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
29c40 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
29c50 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
29c60 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
29c70 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
29c80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
29c90 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
29ca0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
29cb0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72  pHist;.      for
29cc0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
29cd0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69  mt; pPg; pPg=pHi
29ce0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  st->pNextStmt){.
29cf0 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20          pHist = 
29d00 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
29d10 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
29d20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
29d30 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
29d40 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
29d50 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
29d60 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
29d70 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
29d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29d90 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
29da0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
29db0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
29dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29dd0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29de0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
29df0 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
29e00 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
29e10 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
29e20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29e30 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
29e40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29e50 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
29e60 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
29e70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
29e80 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
29e90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29ea0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29eb0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
29ec0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
29ed0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
29ee0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
29ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29f00 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
29f10 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
29f20 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
29f30 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
29f40 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
29f50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29f60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
29f70 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
29f80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
29f90 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
29fa0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
29fb0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
29fc0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
29fd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29fe0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
29ff0 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
2a000 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
2a010 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
2a020 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
2a030 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
2a040 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
2a050 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
2a060 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
2a070 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
2a080 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
2a090 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
2a0a0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
2a0b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a0c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
2a0d0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
2a0e0 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
2a0f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a100 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2a110 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2a120 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
2a130 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a140 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
2a150 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
2a160 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
2a170 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
2a180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
2a190 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2a1a0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
2a1b0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2a1c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2a1d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
2a1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a1f0 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
2a200 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
2a210 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
2a220 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
2a230 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
2a240 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
2a250 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
2a260 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
2a270 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a280 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2a290 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
2a2a0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2a2b0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
2a2c0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
2a2d0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
2a2e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
2a2f0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
2a300 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
2a310 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2a320 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
2a330 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
2a340 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
2a350 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
2a360 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
2a370 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
2a380 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
2a390 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a3a0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2a3b0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
2a3c0 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
2a3d0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
2a3e0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
2a3f0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
2a400 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
2a410 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
2a420 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
2a430 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
2a440 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
2a450 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
2a460 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
2a470 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
2a480 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20  revious located 
2a490 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
2a4a0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
2a4b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2a4c0 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
2a4d0 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
2a4e0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2a4f0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
2a500 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
2a510 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
2a520 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
2a530 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
2a540 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
2a550 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
2a560 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
2a570 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
2a580 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
2a590 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
2a5a0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
2a5b0 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
2a5c0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
2a5d0 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
2a5e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2a5f0 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
2a600 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
2a610 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
2a620 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
2a630 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
2a640 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
2a650 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
2a660 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
2a670 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
2a680 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
2a690 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
2a6a0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a6b0 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
2a6c0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
2a6d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
2a6e0 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
2a6f0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
2a700 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65  *pPgOld;  /* The
2a710 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72   page being over
2a720 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e  written. */.  in
2a730 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
2a740 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
2a750 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
2a760 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
2a770 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
2a780 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
2a790 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
2a7a0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
2a7b0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
2a7c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2a7d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
2a7e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
2a7f0 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
2a800 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
2a810 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2a820 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
2a830 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
2a840 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
2a850 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
2a860 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
2a870 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
2a880 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
2a890 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
2a8a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
2a8b0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
2a8c0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
2a8d0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2a8e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2a8f0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
2a900 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
2a910 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  ts hash-chain */
2a920 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
2a930 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
2a940 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2a950 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
2a960 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
2a970 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
2a980 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
2a990 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
2a9a0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
2a9b0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
2a9c0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
2a9d0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
2a9e0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
2a9f0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
2aa00 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
2aa10 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
2aa20 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
2aa30 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  .  pPg->needSync
2aa40 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d   = 0;.  pPgOld =
2aa50 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2aa60 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
2aa70 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
2aa80 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
2aa90 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
2aaa0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
2aab0 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
2aac0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
2aad0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d  PgOld);.    pPg-
2aae0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f  >needSync = pPgO
2aaf0 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20  ld->needSync;.  
2ab00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
2ab10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
2ab20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  }.  pPg->inJourn
2ab30 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
2ab40 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2ab50 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2ab60 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  ;..  /* Change t
2ab70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
2ab80 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
2ab90 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
2aba0 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
2abb0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
2abc0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
2abd0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
2abe0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
2abf0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
2ac00 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2ac10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ac20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2ac30 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
2ac40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
2ac50 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
2ac60 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
2ac70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
2ac80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2ac90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
2aca0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
2acb0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
2acc0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
2acd0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
2ace0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
2acf0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2ad00 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
2ad10 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
2ad20 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
2ad30 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
2ad40 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
2ad50 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
2ad60 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
2ad70 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
2ad80 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
2ad90 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
2ada0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
2adb0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
2adc0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
2add0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
2ade0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
2adf0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61  d the .    ** Pa
2ae00 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
2ae10 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  it has been set.
2ae20 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
2ae30 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f  e remedied by lo
2ae40 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ading.    ** the
2ae50 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2ae60 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
2ae70 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
2ae80 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a  .needSync flag..
2ae90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2aea0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
2aeb0 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
2aec0 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
2aed0 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
2aee0 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
2aef0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
2af00 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
2af10 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
2af20 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
2af30 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
2af40 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
2af50 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
2af60 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
2af70 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2af80 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
2af90 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2afa0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
2afb0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
2afc0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
2afd0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
2afe0 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
2aff0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
2b000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
2b010 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
2b020 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
2b030 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2b040 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2b050 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
2b060 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
2b070 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
2b080 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
2b090 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
2b0a0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
2b0b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
2b0c0 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
2b0d0 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
2b0e0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
2b0f0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
2b100 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2b110 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
2b120 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
2b130 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
2b150 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2b160 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65  rnal && (int)nee
2b170 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
2b180 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
2b190 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b1a0 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
2b1b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
2b1c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20  needSyncPgno);. 
2b1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
2b1e0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
2b1f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
2b210 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
2b220 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
2b230 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2b240 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
2b250 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
2b260 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
2b270 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2b280 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2b290 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ..  pagerLeave(p
2b2a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
2b2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2b2c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
2b2d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2b2e0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
2b2f0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2b300 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2b310 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
2b320 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2b330 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
2b340 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
2b350 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2b360 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
2b370 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
2b380 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
2b390 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
2b3a0 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
2b3b0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2b3c0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2b3d0 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
2b3e0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2b3f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2b400 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
2b410 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
2b420 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
2b430 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
2b440 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
2b450 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
2b460 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
2b470 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
2b480 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
2b490 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
2b4a0 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
2b4b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
2b4c0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
2b4d0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
2b4e0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
2b4f0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
2b500 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
2b510 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
2b520 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
2b530 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
2b540 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
2b550 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
2b560 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2b570 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
2b580 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2b590 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
2b5a0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
2b5b0 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
2b5c0 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
2b5d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2b5e0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
2b5f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
2b600 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
2b610 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
2b620 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b630 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
2b640 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2b650 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2b660 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
2b670 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
2b680 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2b690 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2b6a0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2b6b0 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
2b6c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2b6d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2b6e0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
2b6f0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b700 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
2b710 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
2b720 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2b730 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
2b740 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
2b750 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
2b760 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
2b770 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
2b780 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
2b790 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
2b7a0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
2b7b0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
2b7c0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
2b7d0 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  of PAGER_JOURNAL
2b7e0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
2b7f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
2b800 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47 45  LETE or .** PAGE
2b810 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2b820 52 53 49 53 54 2e 20 49 66 20 74 68 65 20 70 61  RSIST. If the pa
2b830 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
2b840 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
2b850 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
2b860 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
2b870 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
2b880 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
2b890 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
2b8a0 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
2b8b0 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a 2a  ODE_DELETE or.**
2b8c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2b8d0 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e 64 69  DE_PERSIST, indi
2b8e0 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
2b8f0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
2b900 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ated).** journal
2b910 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
2b920 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2b930 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
2b940 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
2b950 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2b960 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2b970 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
2b980 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2b990 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b9a0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
2b9b0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
2b9c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b9d0 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20  _PERSIST.       
2b9e0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
2b9f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ba00 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74  _OFF );.  assert
2ba10 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2ba20 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
2ba30 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
2ba40 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2ba50 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4a 4f  E>=0 && PAGER_JO
2ba60 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2ba70 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  T>=0 );.  if( eM
2ba80 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50  ode>=0 ){.    pP
2ba90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2baa0 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
2bab0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
2bac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2bad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
2bae0 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
2baf0 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
2bb00 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
2bb10 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  les..*/.i64 sqli
2bb20 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
2bb30 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
2bb40 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
2bb50 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
2bb60 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
2bb70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2bb80 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
2bb90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
2bba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2bbb0 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  Limit;.}..#ifdef
2bbc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2bbd0 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
2bbe0 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
2bbf0 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
2bc00 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
2bc10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2bc20 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
2bc30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
2bc40 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
2bc50 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
2bc60 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
2bc70 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
2bc80 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
2bc90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bca0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2bcb0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
2bcc0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
2bcd0 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
2bce0 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
2bcf0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
2bd00 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
2bd10 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2bd20 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
2bd30 2f 0a                                            /.