/ Hex Artifact Content
Login

Artifact a3a916b7215bbdc973e231cde66aaa23871a9072:


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 36  : pager.c,v 1.46
0350: 32 20 32 30 30 38 2f 30 37 2f 30 37 20 31 38 3a  2 2008/07/07 18:
0360: 34 32 3a 34 31 20 64 61 6e 69 65 6c 6b 31 39 37  42:41 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 67 48 64 72 20 2a 70 50  MENT.  PgHdr *pP
3090: 72 65 76 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  revAll;         
30a0: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
30b0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
30c0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67    PagerLruLink g
30d0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
30e0: 20 2f 2a 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20   /* Global list 
30f0: 6f 66 20 6e 52 65 66 3d 3d 30 20 70 61 67 65 73  of nRef==0 pages
3100: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
3110: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
3120: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
3130: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f  ash;.#endif.  vo
3140: 69 64 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  id *pData;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3160: 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f  Page data */.  /
3170: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
3180: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
3190: 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  ta appended to t
31a0: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b  his header */.};
31b0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
31c0: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
31d0: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
31e0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
31f0: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
3200: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
3210: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
3220: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
3230: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
3240: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
3250: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
3260: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
3270: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
3280: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
3290: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
32a0: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
32b0: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
32c0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
32d0: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
32e0: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
32f0: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
3300: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
3310: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
3320: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
3330: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
3340: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
3350: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
3360: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
3370: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
3380: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
3390: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
33a0: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
33b0: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
33c0: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
33d0: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
33e0: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
33f0: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
3400: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
3410: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
3420: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
3430: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
3440: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
3450: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
3460: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
3470: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
3480: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
3490: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
34a0: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
34b0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
34c0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
34d0: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
34e0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
34f0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3500: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
3510: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
3540: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3550: 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rnal */.};../*.*
3560: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
3570: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
3580: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
3590: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
35a0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
35b0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
35c0: 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d  (P,D,N,X) if( P-
35d0: 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d  >xCodec!=0 ){ P-
35e0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
35f0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
3600: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
3610: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
3620: 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d  (P->xCodec!=0?P-
3630: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
3640: 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a  cArg,D,N,X):D)).
3650: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
3660: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f  ODEC1(P,D,N,X) /
3670: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
3680: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
3690: 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23  ,X) ((char*)D).#
36a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
36b0: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
36c0: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
36d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
36e0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
36f0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
3700: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
3710: 28 50 29 20 20 20 20 28 28 50 29 2d 3e 70 44 61  (P)    ((P)->pDa
3720: 74 61 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  ta).#define PGHD
3730: 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20  R_TO_EXTRA(G,P) 
3740: 28 28 76 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d  ((void*)&((G)[1]
3750: 29 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  )).#define PGHDR
3760: 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20  _TO_HIST(P,PGR) 
3770: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   \.            (
3780: 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63  (PgHistory*)&((c
3790: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
37a0: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
37b0: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
37c0: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
37d0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
37e0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
37f0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e  re..**.** Pager.
3800: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
3810: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
3820: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
3830: 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c  PT, or.** or SQL
3840: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
3850: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
3860: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
3870: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
3880: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
3890: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
38a0: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
38b0: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
38c0: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
38d0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
38e0: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
38f0: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
3900: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
3910: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
3920: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
3930: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
3940: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
3950: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
3960: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
3970: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
3980: 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73  PagerGet() and s
3990: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
39a0: 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65  p().** APIs, the
39b0: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
39c0: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
39d0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
39e0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
39f0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
3a00: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
3a10: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
3a20: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f  */.  u8 journalO
3a30: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3a40: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
3a50: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
3a60: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
3a70: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
3a80: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
3a90: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
3aa0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
3ab0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
3ac0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
3ae0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
3af0: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
3b00: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
3b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3b20: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
3b30: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
3b40: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
3b50: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
3b60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3b70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3b80: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
3b90: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
3ba0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
3bb0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
3bc0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
3bd0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
3be0: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
3bf0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
3c00: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
3c10: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
3c20: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
3c30: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
3c60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
3c70: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
3c80: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3c90: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
3ca0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
3cb0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
3cc0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e  ness */.  u8 syn
3cd0: 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  c_flags;        
3ce0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3cf0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
3d00: 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38  YNC_FULL */.  u8
3d10: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
3d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
3d30: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
3d40: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
3d50: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  tc. */.  u8 temp
3d60: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
3d70: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
3d80: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
3d90: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
3da0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
3db0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
3dc0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
3dd0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
3de0: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
3df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3e00: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
3e10: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
3e20: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
3e30: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
3e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3e50: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
3e60: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
3e70: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
3e80: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
3e90: 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f  * Disable DontRo
3ea0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
3eb0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
3ec0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3ee0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3ef0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
3f00: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
3f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3f20: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
3f30: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3f40: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
3f50: 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20  doNotSync;      
3f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3f70: 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c  ean. While true,
3f80: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   do not spill th
3f90: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20  e cache */.  u8 
3fa0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
3fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3fc0: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3fd0: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3fe0: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3ff0: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
4000: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
4010: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
4020: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
4030: 0a 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64  .  u8 dbModified
4040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4050: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
4060: 61 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  are any changes 
4070: 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75  to the Db */.  u
4080: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
4090: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
40a0: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
40b0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
40c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
40d0: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
40e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
40f0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
4100: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
4110: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
4120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4130: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
4140: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
4150: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4170: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
4180: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
4190: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41b0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
41c0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
41d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
41e0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
41f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
4200: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
4210: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
4220: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4250: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
4260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
4270: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4290: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
42a0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
42b0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
42c0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42e0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
42f0: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
4300: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
4310: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
4320: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
4330: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4340: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4350: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
4360: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
4370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4380: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4390: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
43a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
43c0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
43d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
43e0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
43f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4400: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
4410: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
4420: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
4430: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
4440: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
4450: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
4460: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
4470: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
4480: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4490: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
44a0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
44b0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
44c0: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
44d0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
44e0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
44f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4500: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4510: 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b  Bitvec *pInStmt;
4520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4530: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
4540: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
4550: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
4560: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4590: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
45a0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
45b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
45e0: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
45f0: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4600: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
4610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
4620: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4630: 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f  *fd, *jfd;     /
4640: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4650: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
4660: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
4670: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
4680: 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  tfd;         /* 
4690: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
46a0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
46b0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
46c0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
46d0: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
46e0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
46f0: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
4700: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20  .  PagerLruList 
4710: 6c 72 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lru;           /
4720: 2a 20 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72  * LRU list of fr
4730: 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ee pages */.  Pg
4740: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4760: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
4770: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
4780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4790: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
47a0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
47b0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
47c0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47e0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
47f0: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
4800: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
4810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4820: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
4830: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4840: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
4850: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
4860: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
4870: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
4880: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4890: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
48a0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
48b0: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
48c0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
48d0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
48e0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
48f0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
4900: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
4910: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
4920: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
4930: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
4940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
4950: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
4960: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
4970: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
4980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4990: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
49a0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
49b0: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
49c0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
49d0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
49e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
49f0: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
4a00: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
4a10: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
4a20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4a30: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
4a40: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
4a50: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
4a60: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
4a70: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a80: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
4a90: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
4aa0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
4ab0: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
4ac0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4ad0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4ae0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
4af0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b00: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
4b10: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
4b20: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
4b30: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
4b40: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4b50: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
4b60: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
4b70: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4b80: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
4b90: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61  #endif.  int nHa
4ba0: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
4bb0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
4bc0: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
4bd0: 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  able */.  PgHdr 
4be0: 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20  **aHash;        
4bf0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
4c00: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
4c10: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
4c20: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4c30: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
4c40: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65  ANAGEMENT.  Page
4c50: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c          /* Doubl
4c70: 79 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  y linked list of
4c80: 20 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68   pagers on which
4c90: 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72   */.  Pager *pPr
4ca0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4cb0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c    /* sqlite3_rel
4cc0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69  ease_memory() wi
4cd0: 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 76 6f 6c  ll work */.  vol
4ce0: 61 74 69 6c 65 20 69 6e 74 20 69 49 6e 55 73 65  atile int iInUse
4cf0: 4d 4d 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  MM;      /* Non-
4d00: 7a 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61  zero if unavaila
4d10: 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 76  ble to MM */.  v
4d20: 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69 49 6e 55  olatile int iInU
4d30: 73 65 44 42 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  seDB;      /* No
4d40: 6e 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c  n-zero if in sql
4d50: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4d60: 6f 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  ory() */.#endif.
4d70: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
4d80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4d90: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
4da0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
4db0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
4dc0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
4dd0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
4de0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
4df0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
4e00: 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a  anges */.  i64 j
4e10: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
4e20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c         /* Size l
4e30: 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74  imit for persist
4e40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
4e50: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
4e60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4e70: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4e80: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4e90: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4ea0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4eb0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4ec0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4ed0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4ee0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4ef0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4f00: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4f10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4f20: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4f30: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4f40: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4f50: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4f60: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4f70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4f80: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4f90: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4fa0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4fb0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4fc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4fd0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4fe0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4ff0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
5000: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
5010: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
5020: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
5030: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
5040: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
5050: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
5060: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
5070: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
5080: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
5090: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(v).#endif../*.
50a0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
50b0: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
50c0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
50d0: 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20  a double-linked 
50e0: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70  list.** of all p
50f0: 61 67 65 72 73 20 74 68 61 74 20 61 72 65 20 65  agers that are e
5100: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67 65  ligible for page
5110: 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68 65   stealing by the
5120: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  .** sqlite3_rele
5130: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74  ase_memory() int
5140: 65 72 66 61 63 65 2e 20 20 41 63 63 65 73 73 20  erface.  Access 
5150: 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 0a  to this list is.
5160: 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  ** protected by 
5170: 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  the SQLITE_MUTEX
5180: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74  _STATIC_MEM2 mut
5190: 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ex..*/.#ifdef SQ
51a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
51b0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74  RY_MANAGEMENT.st
51c0: 61 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c 69  atic Pager *sqli
51d0: 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 30  te3PagerList = 0
51e0: 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c 72  ;.static PagerLr
51f0: 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72 75  uList sqlite3Lru
5200: 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30  PageList = {0, 0
5210: 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f  , 0};.#endif.../
5220: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
5230: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
5240: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
5250: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
5260: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
5270: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
5280: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
5290: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
52a0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
52b0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
52c0: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
52d0: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
52e0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
52f0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
5300: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
5310: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
5320: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
5330: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
5340: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
5350: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
5360: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
5370: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
5380: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
5390: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
53a0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
53b0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
53c0: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
53d0: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
53e0: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
53f0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
5400: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
5410: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
5420: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
5430: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
5440: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
5450: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
5460: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
5470: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
5480: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
5490: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
54a0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
54b0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
54c0: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
54d0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
54e0: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
54f0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
5500: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
5510: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
5520: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
5530: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
5540: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
5550: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5560: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
5570: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
5580: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
5590: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
55a0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
55b0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
55c0: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
55d0: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
55e0: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
55f0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
5600: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
5610: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
5620: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
5630: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
5640: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
5650: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
5660: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
5670: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
5680: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
5690: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
56a0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
56b0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
56c0: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
56d0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
56e0: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
56f0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
5700: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
5710: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
5720: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
5730: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5740: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5750: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
5760: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
5770: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
5780: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
5790: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
57a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
57b0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
57c0: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
57d0: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
57e0: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
57f0: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
5800: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5810: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5820: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5830: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5840: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5850: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
5860: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
5870: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
5880: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
5890: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
58a0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
58b0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
58c0: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
58d0: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
58e0: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
58f0: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
5900: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
5910: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5920: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5930: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5940: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5950: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5960: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
5970: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
5980: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
5990: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
59a0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
59b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
59c0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
59d0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
59e0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
59f0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
5a00: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5a10: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5a20: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5a30: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5a40: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5a60: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
5a70: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
5a80: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
5a90: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5aa0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
5ab0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
5ac0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
5ad0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
5ae0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
5af0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
5b00: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
5b10: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
5b20: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
5b30: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
5b40: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
5b50: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
5b60: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
5b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
5b80: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
5b90: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
5ba0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
5bb0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
5bc0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
5bd0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
5be0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
5bf0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
5c00: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
5c10: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #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 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
5c40: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
5c50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
5c60: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
5c70: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5c80: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
5c90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5ca0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
5cb0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5cc0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5cd0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5ce0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
5cf0: 54 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29  The pagerEnter()
5d00: 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28   and pagerLeave(
5d10: 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69  ) routines acqui
5d20: 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a  re and release.*
5d30: 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63  * a mutex on eac
5d40: 68 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75  h pager.  The mu
5d50: 74 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65  tex is recursive
5d60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
5d70: 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73  a special-purpos
5d80: 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c  e mutex.  It onl
5d90: 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61  y provides mutua
5da0: 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62  l exclusion.** b
5db0: 65 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65  etween the Btree
5dc0: 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20   and the Memory 
5dd0: 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74  Management sqlit
5de0: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
5df0: 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  y().** function.
5e00: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72    It does not pr
5e10: 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70  event, for examp
5e20: 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66  le, two Btrees f
5e30: 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a  rom accessing.**
5e40: 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
5e50: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
5e60: 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c  .  Other general
5e70: 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73  -purpose mutexes
5e80: 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   in.** the btree
5e90: 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68   layer handle th
5ea0: 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66  at chore..*/.#if
5eb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5ec0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
5ed0: 45 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69  ENT.  static voi
5ee0: 64 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67  d pagerEnter(Pag
5ef0: 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69  er *p){.    p->i
5f00: 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69  InUseDB++;.    i
5f10: 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26  f( p->iInUseMM &
5f20: 26 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31  & p->iInUseDB==1
5f30: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
5f40: 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20  TE_MUTEX_NOOP.  
5f50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5f60: 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  x *mutex;.      
5f70: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
5f80: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
5f90: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
5fa0: 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  M2);.#endif.    
5fb0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5fc0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5fd0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
5fe0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
5ff0: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
6000: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6010: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
6020: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
6030: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
6040: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
6050: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
6060: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
6070: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
6080: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
6090: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
60a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
60b0: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
60c0: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
60d0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
60e0: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
60f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6100: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61  linked list mana
6110: 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72 65  ged by structure
6120: 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62  .** pList (pPg b
6130: 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20  ecomes the last 
6140: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73  entry in the lis
6150: 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63  t - the most rec
6160: 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e  ently .** used).
6170: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
6180: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
6190: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
61a0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a   or pPg->gfree,.
61b0: 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
61c0: 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62  whether pPg is b
61d0: 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
61e0: 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63  e pager-specific
61f0: 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52   or.** global LR
6200: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6210: 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50  c void listAdd(P
6220: 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69  agerLruList *pLi
6230: 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  st, PagerLruLink
6240: 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a   *pLink, PgHdr *
6250: 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70  pPg){.  pLink->p
6260: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e  Next = 0;.  pLin
6270: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74  k->pPrev = pList
6280: 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66  ->pLast;..#ifdef
6290: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
62a0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
62b0: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
62c0: 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70  =&pPg->free || p
62d0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
62e0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  e);.  assert(pLi
62f0: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20  nk==&pPg->gfree 
6300: 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74  || pList!=&sqlit
6310: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a  e3LruPageList);.
6320: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c  #endif..  if( pL
6330: 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20  ist->pLast ){.  
6340: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68    int iOff = (ch
6350: 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68  ar *)pLink - (ch
6360: 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61  ar *)pPg;.    Pa
6370: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73  gerLruLink *pLas
6380: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
6390: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
63a0: 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69  )pList->pLast)[i
63b0: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74  Off]);.    pLast
63c0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Link->pNext = pP
63d0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
63e0: 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70  assert(!pList->p
63f0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  First);.    pLis
6400: 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  t->pFirst = pPg;
6410: 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70  .  }..  pList->p
6420: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66  Last = pPg;.  if
6430: 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  ( !pList->pFirst
6440: 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e  Synced && pPg->n
6450: 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20  eedSync==0 ){.  
6460: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
6470: 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d  ynced = pPg;.  }
6480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
6490: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
64a0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
64b0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
64c0: 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e  ted to by pList.
64d0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
64e0: 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69  pLink should poi
64f0: 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67  nt to either pPg
6500: 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67  ->free or pPg->g
6510: 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20  free, depending 
6520: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70  .** on whether p
6530: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
6540: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
6550: 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61  pecific or globa
6560: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6570: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52  tatic void listR
6580: 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69  emove(PagerLruLi
6590: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
65a0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
65b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
65c0: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
65d0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
65e0: 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53  *)pPg;..#ifdef S
65f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6600: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6610: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
6620: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
6630: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
6640: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
6650: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
6660: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
6670: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
6680: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d  ndif..  if( pPg=
6690: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29  =pList->pFirst )
66a0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
66b0: 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  rst = pLink->pNe
66c0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  xt;.  }.  if( pP
66d0: 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  g==pList->pLast 
66e0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c  ){.    pList->pL
66f0: 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ast = pLink->pPr
6700: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
6710: 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ink->pPrev ){.  
6720: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6730: 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67  pPrevLink = (Pag
6740: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
6750: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65  u8 *)pLink->pPre
6760: 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  v)[iOff]);.    p
6770: 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  PrevLink->pNext 
6780: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
6790: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
67a0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61  >pNext ){.    Pa
67b0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78  gerLruLink *pNex
67c0: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
67d0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
67e0: 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69  )pLink->pNext)[i
67f0: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74  Off]);.    pNext
6800: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Link->pPrev = pL
6810: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6820: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6830: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
6840: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
6850: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
6860: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
6870: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
6880: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
6890: 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75   *pL = (PagerLru
68a0: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
68b0: 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  p)[iOff]);.     
68c0: 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a   p = pL->pNext;.
68d0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
68e0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
68f0: 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d  p;.  }..  pLink-
6900: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6910: 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pPrev = 0;.}../*
6920: 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50   .** Add page pP
6930: 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  g to the list of
6940: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6950: 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a  the pager. If .*
6960: 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  * memory-managem
6970: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6980: 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61 67  also add the pag
6990: 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  e to the global 
69a0: 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65  .** list of free
69b0: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
69c0: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64  c void lruListAd
69d0: 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
69e0: 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70   listAdd(&pPg->p
69f0: 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67  Pager->lru, &pPg
6a00: 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69  ->free, pPg);.#i
6a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6a20: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6a30: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d  MENT.  if( !pPg-
6a40: 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
6a50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6a60: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6a70: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6a80: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6a90: 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41  LRU));.    listA
6aa0: 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61  dd(&sqlite3LruPa
6ab0: 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66  geList, &pPg->gf
6ac0: 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73  ree, pPg);.    s
6ad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6ae0: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
6af0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6b00: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6b10: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6b20: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6b30: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6b40: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6b50: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6b60: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6b70: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6b80: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6b90: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ba0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6bb0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6bc0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6bd0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6be0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6bf0: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6c00: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6c10: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6c20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6c30: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6c40: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6c50: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6c60: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6c70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6c80: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
6c90: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6ca0: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c  TIC_LRU));.    l
6cb0: 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c 69 74  istRemove(&sqlit
6cc0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26  e3LruPageList, &
6cd0: 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29  pPg->gfree, pPg)
6ce0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6cf0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
6d00: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6d10: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6d20: 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  LRU));.  }.#endi
6d30: 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  f.}../* .** This
6d40: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6d50: 6c 65 64 20 6a 75 73 74 20 61 66 74 65 72 20 74  led just after t
6d60: 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
6d70: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
6d80: 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70 61  d.** from all pa
6d90: 67 65 73 20 6d 61 6e 61 67 65 64 20 62 79 20 70  ges managed by p
6da0: 50 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20 62  Pager (usually b
6db0: 65 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e  ecause the journ
6dc0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 6a  al file.** has j
6dd0: 75 73 74 20 62 65 65 6e 20 73 79 6e 63 65 64 29  ust been synced)
6de0: 2e 20 49 74 20 75 70 64 61 74 65 73 20 74 68 65  . It updates the
6df0: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
6e00: 72 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62  rstSynced variab
6e10: 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d 65  le.** and, if me
6e20: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6e30: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20  is enabled, the 
6e40: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6e50: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 0a  st.pFirstSynced.
6e60: 2a 2a 20 76 61 72 69 61 62 6c 65 20 61 6c 73 6f  ** variable also
6e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6e80: 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74   lruListSetFirst
6e90: 53 79 6e 63 65 64 28 50 61 67 65 72 20 2a 70 50  Synced(Pager *pP
6ea0: 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
6eb0: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6ec0: 64 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e  d = pPager->lru.
6ed0: 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53  pFirst;.#ifdef S
6ee0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6ef0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6f00: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
6f10: 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72  mDb ){.    PgHdr
6f20: 20 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   *p;.    sqlite3
6f30: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
6f40: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6f50: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6f60: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f  IC_LRU));.    fo
6f70: 72 28 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61  r(p=sqlite3LruPa
6f80: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70  geList.pFirst; p
6f90: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b   && p->needSync;
6fa0: 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78   p=p->gfree.pNex
6fb0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  t);.    assert(p
6fc0: 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
6fd0: 69 72 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d  irstSynced || p=
6fe0: 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  =sqlite3LruPageL
6ff0: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
7000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72  );.    sqlite3Lr
7010: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7020: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
7030: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7040: 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
7050: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
7060: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
7070: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
7080: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
7090: 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68 61   if page *pPg ha
70a0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
70b0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
70c0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e  atement.** journ
70d0: 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  al (or statement
70e0: 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65   snapshot has be
70f0: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a  en created, if *
7100: 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f  pPg is part.** o
7110: 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  f an in-memory d
7120: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
7130: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74  tic int pageInSt
7140: 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70  atement(PgHdr *p
7150: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7160: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7170: 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  er;.  if( MEMDB 
7180: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47  ){.    return PG
7190: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
71a0: 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74   pPager)->inStmt
71b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
71c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
71d0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
71e0: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
71f0: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
7200: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
7210: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
7220: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
7230: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
7240: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
7250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7260: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
7270: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
7280: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
7290: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
72a0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
72b0: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
72c0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
72d0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
72e0: 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65  MIT.  if( N*size
72f0: 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c  of(aHash[0])>SQL
7300: 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f  ITE_MALLOC_SOFT_
7310: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d  LIMIT ){.    N =
7320: 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53   SQLITE_MALLOC_S
7330: 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66  OFT_LIMIT/sizeof
7340: 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a  (aHash[0]);.  }.
7350: 20 20 69 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d    if( N==pPager-
7360: 3e 6e 48 61 73 68 20 29 20 72 65 74 75 72 6e 3b  >nHash ) return;
7370: 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 4c  .#endif.  pagerL
7380: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
7390: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
73a0: 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33 42 65  h!=0 ) sqlite3Be
73b0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
73c0: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
73d0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
73e0: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
73f0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  *N );.  if( pPag
7400: 65 72 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73  er->aHash!=0 ) s
7410: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
7420: 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72  alloc();.  pager
7430: 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
7440: 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b   if( aHash==0 ){
7450: 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20  .    /* Failure 
7460: 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74  to rehash is not
7470: 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69   an error.  It i
7480: 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d  s only a perform
7490: 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20  ance hit. */.   
74a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
74b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
74c0: 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50  er->aHash);.  pP
74d0: 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b  ager->nHash = N;
74e0: 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
74f0: 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28   = aHash;.  for(
7500: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7510: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
7520: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
7530: 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50  nt h;.    if( pP
7540: 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
7550: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7560: 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
7570: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
7580: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  =0 );.      cont
7590: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
75a0: 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20  h = pPg->pgno & 
75b0: 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (N-1);.    pPg->
75c0: 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73  pNextHash = aHas
75d0: 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48  h[h];.    if( aH
75e0: 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20  ash[h] ){.      
75f0: 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
7600: 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
7610: 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20  .    aHash[h] = 
7620: 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  pPg;.    pPg->pP
7630: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d  revHash = 0;.  }
7640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
7650: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
7660: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
7670: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
7680: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
7690: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
76a0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
76b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
76c0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
76d0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
76e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
76f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7700: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
7710: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
7720: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
7730: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
7740: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
7750: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
7760: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
7770: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
7780: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
7790: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
77a0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
77b0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
77c0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
77d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
77e0: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
77f0: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
7800: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7810: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
7820: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
7830: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
7840: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
7850: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
7860: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
7870: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
7880: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
7890: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
78a0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
78b0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
78c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
78d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
78e0: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
78f0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
7900: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
7910: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
7920: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
7930: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
7940: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
7950: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
7960: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
7970: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
7980: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7990: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
79a0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
79b0: 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64  *.** If file pFd
79c0: 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73   is open, call s
79d0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
79e0: 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   on it..*/.stati
79f0: 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73  c int osUnlock(s
7a00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64  qlite3_file *pFd
7a10: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
7a20: 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f  if( !pFd->pMetho
7a30: 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ds ){.    return
7a40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
7a50: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7a60: 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c  OsUnlock(pFd, eL
7a70: 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ock);.}../*.** T
7a80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
7a90: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
7aa0: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
7ab0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
7ac0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
7ad0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
7ae0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
7af0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
7b00: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
7b10: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7b20: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
7b30: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
7b40: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
7b50: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
7b60: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
7b70: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
7b80: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
7b90: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7ba0: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
7bb0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
7bc0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
7bd0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
7be0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
7bf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
7c00: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
7c10: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
7c20: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
7c30: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
7c40: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
7c50: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
7c60: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
7c70: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
7c80: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
7c90: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
7ca0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
7cb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
7cc0: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
7cd0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
7ce0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
7cf0: 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20  {.  int dc;     
7d00: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
7d10: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
7d20: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  */.  int nSector
7d30: 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ;      /* Sector
7d40: 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 73   size */.  int s
7d50: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  zPage;        /*
7d60: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   Page size */.  
7d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7d80: 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a   = pPager->fd;..
7d90: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
7da0: 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73  ds ){.    dc = s
7db0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7dc0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66 64  aracteristics(fd
7dd0: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
7de0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
7df0: 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 73 7a  Size(fd);.    sz
7e00: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
7e10: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  ageSize;.  }..  
7e20: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
7e30: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
7e40: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65  512>>8));.  asse
7e50: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7e60: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
7e70: 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21  6>>8));..  if( !
7e80: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20  fd->pMethods || 
7e90: 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28 53  .       (dc & (S
7ea0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7eb0: 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20  IC|(szPage>>8)) 
7ec0: 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50 61  && nSector<=szPa
7ed0: 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ge) ){.    retur
7ee0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
7ef0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
7f00: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
7f10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7f20: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
7f30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7f40: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
7f50: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f   when an error o
7f60: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
7f70: 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20   pager.** code. 
7f80: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7f90: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
7fa0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
7fb0: 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73  ucture, the.** s
7fc0: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
7fd0: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
7fe0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
7ff0: 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
8000: 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  n. .** The value
8010: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
8020: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
8030: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
8040: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
8050: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
8060: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
8070: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
8080: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53  TE_CORRUPT, or S
8090: 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68  QLITE_FULL.** th
80a0: 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20  e error becomes 
80b0: 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69  persistent. Unti
80c0: 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20  l the persisten 
80d0: 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64  error is cleared
80e0: 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20  ,.** subsequent 
80f0: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
8100: 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  s Pager will imm
8110: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
8120: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72  the same .** err
8130: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  or code..**.** A
8140: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
8150: 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  r indicates that
8160: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8170: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
8180: 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
8190: 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
81a0: 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
81b0: 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
81c0: 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
81d0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
81e0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
81f0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
8200: 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
8210: 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
8220: 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  nt error occured
8230: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
8240: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
8250: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
8260: 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  played..*/.stati
8270: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
8280: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
8290: 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  r);.static int p
82a0: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
82b0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
82c0: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
82d0: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
82e0: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
82f0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
8300: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
8310: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8320: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
8330: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
8340: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
8350: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
8360: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
8370: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
8380: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8390: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
83a0: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
83b0: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
83c0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
83d0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
83e0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
83f0: 4c 4f 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  LOCK && pPager->
8400: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
8410: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
8420: 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f   is already unlo
8430: 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72  cked, call pager
8440: 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f  _unlock() now to
8450: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20  .      ** clear 
8460: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
8470: 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20  and ensure that 
8480: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
8490: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  is .      ** com
84a0: 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20  pletely empty.. 
84b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61       */.      pa
84c0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
84d0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
84e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
84f0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
8500: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
8510: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
8520: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
8530: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
8540: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
8550: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
8560: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
8570: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
8580: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
8590: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
85a0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
85b0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
85c0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
85d0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
85e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
85f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
8600: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
8610: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
8620: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
8630: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
8640: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
8650: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
8660: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
8670: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
8680: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
8690: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
86a0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
86b0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
86c0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
86d0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
86e0: 69 7a 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ize, .          
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
8700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50  nsigned char *)P
8710: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61  GHDR_TO_DATA(pPa
8720: 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ge));.}../*.** T
8730: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
8740: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
8750: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
8760: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
8770: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
8780: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
8790: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
87a0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
87b0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
87c0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
87d0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
87e0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
87f0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
8800: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
8810: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
8820: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
8830: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
8840: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
8850: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
8860: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
8870: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
8880: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
8890: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
88a0: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
88b0: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
88c0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
88d0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
88e0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
88f0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
8900: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
8910: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
8920: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
8930: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
8940: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
8950: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
8960: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
8970: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
8980: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
8990: 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  en..** The maste
89a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
89b0: 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ame is read from
89c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
89d0: 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69  file and .** wri
89e0: 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
89f0: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
8a00: 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   caller. .**.** 
8a10: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
8a20: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
8a30: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
8a40: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
8a50: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
8a60: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
8a70: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
8a80: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
8a90: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
8aa0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
8ab0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
8ac0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8ad0: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
8ae0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
8af0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
8b00: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
8b10: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
8b20: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
8b30: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
8b40: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
8b50: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
8b60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8b70: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
8b80: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
8b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
8ba0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8bb0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
8bc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
8bd0: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
8be0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
8bf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8c00: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
8c10: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
8c20: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
8c30: 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74  aster, int nMast
8c40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
8c50: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
8c60: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
8c70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
8c80: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8c90: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
8ca0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
8cb0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
8cc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
8cd0: 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  0';..  rc = sqli
8ce0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
8cf0: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
8d00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8d10: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
8d20: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
8d30: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
8d40: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a   szJ-16, &len);.
8d50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8d60: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8d70: 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61  ..  if( len>=nMa
8d80: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
8d90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8da0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
8db0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
8dc0: 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  12, &cksum);.  i
8dd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8de0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8df0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8e00: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
8e10: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20  c, 8, szJ-8);.  
8e20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8e30: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
8e40: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
8e50: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
8e60: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
8e70: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
8e80: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
8e90: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
8ea0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8eb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8ec0: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
8ed0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f  en] = '\0';..  /
8ee0: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
8ef0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
8f00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8f10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
8f20: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
8f30: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
8f40: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20  aster[i];.   }. 
8f50: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
8f60: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
8f70: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
8f80: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
8f90: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
8fa0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
8fb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8fc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8fd0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
8fe0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
8ff0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
9000: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
9010: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
9020: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
9030: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
9040: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
9050: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
9060: 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  .    zMaster[0] 
9070: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
9080: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9090: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
90a0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
90b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
90c0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
90d0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
90e0: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
90f0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
9100: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
9110: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
9120: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
9130: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
9140: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
9150: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
9160: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
9170: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
9180: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
9190: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91c0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
91e0: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
9200: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
9220: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
9250: 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72  ic void seekJour
9260: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
9270: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
9280: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
9290: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
92a0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
92b0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
92c0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
92d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
92e0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
92f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
9300: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9310: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
9320: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
9330: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
9340: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
9350: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
9360: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9370: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
9380: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
9390: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
93a0: 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65  e zeros over the
93b0: 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
93c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
93d0: 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66  is has the.** ef
93e0: 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61  fect of invalida
93f0: 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
9400: 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74   file and commit
9410: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e  ting the.** tran
9420: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
9430: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
9440: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
9450: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
9460: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
9470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74   SQLITE_OK;.  st
9480: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9490: 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20  zeroHdr[28];..  
94a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
94b0: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 69 36  nalOff ){.    i6
94c0: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
94d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
94e0: 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52 41 43  mit;..    IOTRAC
94f0: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
9500: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
9510: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
9520: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
9530: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9540: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
9550: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
9560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9570: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9580: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9590: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
95a0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
95b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
95c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
95d0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
95e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
95f0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
9600: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
9610: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
9620: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
9630: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
9640: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
9650: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
9660: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
9670: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
9680: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
9690: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
96a0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
96b0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
96c0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
96d0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
96e0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
96f0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
9700: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
9710: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
9720: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
9730: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
9740: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
9750: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
9760: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
9770: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
9780: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
9790: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
97a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
97b0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
97c0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
97d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
97e0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
97f0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
9800: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9810: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
9820: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
9830: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
9840: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
9850: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
9860: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9870: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
9880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9890: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
98a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
98b0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
98c0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
98d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
98e0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
98f0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9900: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
9910: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
9930: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
9940: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
9950: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
9960: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
9970: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
9980: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
9990: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
99a0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
99b0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
99c0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
99d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
99e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
99f0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
9a00: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
9a10: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
9a20: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
9a30: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
9a40: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
9a50: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
9a60: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
9a70: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
9a80: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
9a90: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
9aa0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
9ab0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
9ac0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
9ad0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9ae0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
9af0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9b00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9b10: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
9b20: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
9b30: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e  >pTmpSpace;.  in
9b40: 74 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67  t nHeader = pPag
9b50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
9b60: 69 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69  int nWrite;..  i
9b70: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
9b80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9b90: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
9ba0: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
9bb0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
9bc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9bd0: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
9be0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
9bf0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
9c00: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
9c10: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
9c20: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
9c30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9c40: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9c50: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
9c60: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
9c70: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9c80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9c90: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
9ca0: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
9cb0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
9cc0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
9cd0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
9ce0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
9cf0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
9d00: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
9d10: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
9d20: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
9d30: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
9d40: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
9d50: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
9d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
9d70: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
9d80: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
9d90: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
9da0: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
9db0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
9dc0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
9dd0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
9de0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
9df0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
9e00: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
9e10: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
9e20: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
9e30: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
9e40: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
9e50: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
9e60: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
9e70: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
9e80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9e90: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
9ea0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
9eb0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
9ec0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
9ed0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
9ee0: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
9ef0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
9f00: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
9f10: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
9f20: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
9f30: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
9f40: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
9f50: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
9f60: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
9f70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9f80: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
9f90: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
9fa0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
9fb0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
9fc0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
9fd0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
9fe0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
9ff0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
a000: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
a010: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
a020: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
a030: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
a040: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
a050: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
a060: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
a070: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
a080: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
a090: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
a0a0: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
a0b0: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
a0c0: 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33   .   || (sqlite3
a0d0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
a0e0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
a0f0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
a100: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
a110: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
a120: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a130: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a140: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
a150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
a160: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
a170: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a180: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
a190: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
a1a0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
a1b0: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
a1c0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
a1d0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
a1e0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
a1f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a200: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
a210: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
a220: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
a230: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a240: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
a250: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
a260: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
a270: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a280: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a290: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
a2a0: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
a2b0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
a2c0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
a2d0: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
a2e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
a2f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
a300: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
a310: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
a320: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a330: 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lHdr==0 ){.    /
a340: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
a350: 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  */.    put32bits
a360: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
a370: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a380: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
a390: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  eSize);.  }..  f
a3a0: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
a3b0: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
a3c0: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
a3d0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
a3e0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
a3f0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
a400: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
a410: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
a420: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
a430: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
a440: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
a450: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
a460: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
a470: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
a480: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
a490: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
a4a0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
a4b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a4c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a4d0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
a4e0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
a4f0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
a500: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
a510: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a520: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
a530: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a540: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
a550: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
a560: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
a570: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
a580: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
a590: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
a5a0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
a5b0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
a5c0: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
a5d0: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
a5e0: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
a5f0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a600: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
a610: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
a620: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
a630: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
a640: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a650: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
a660: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
a670: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
a680: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
a690: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
a6a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
a6b0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
a6c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
a6d0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
a6e0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
a6f0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
a700: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
a710: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
a720: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
a730: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
a740: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
a750: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
a760: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
a770: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
a780: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
a790: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
a7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a7b0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
a7c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
a7d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
a7e0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
a7f0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
a800: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
a810: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
a820: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
a830: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
a840: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
a850: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
a860: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
a870: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
a880: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
a890: 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20  nt iPageSize;.. 
a8a0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
a8b0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
a8c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a8d0: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
a8e0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
a8f0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
a900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a910: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
a920: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
a930: 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71  lOff;..  rc = sq
a940: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
a950: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
a960: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
a970: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
a980: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a990: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69  .  jrnlOff += si
a9a0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20  zeof(aMagic);.. 
a9b0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
a9c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
a9d0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a9e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
a9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
aa00: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
aa10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
aa20: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e  jfd, jrnlOff, pN
aa30: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
aa40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
aa50: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
aa60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
aa70: 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e  Off+4, &pPager->
aa80: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
aa90: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
aaa0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
aab0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
aac0: 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62  , jrnlOff+8, pDb
aad0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
aae0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
aaf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ab00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
ab10: 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29  lOff+16, (u32 *)
ab20: 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  &iPageSize);.  i
ab30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ab40: 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a   .   && iPageSiz
ab50: 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50  e>=512 .   && iP
ab60: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
ab70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
ab80: 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65    && ((iPageSize
ab90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d  -1)&iPageSize)==
aba0: 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20  0 .  ){.    u16 
abb0: 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65  pagesize = iPage
abc0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
abd0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
abe0: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
abf0: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  pagesize);.  }. 
ac00: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ac10: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
ac20: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
ac30: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
ac40: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
ac50: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
ac60: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ac70: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ac80: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ac90: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
aca0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
acb0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
acc0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
acd0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
ace0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
acf0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
ad00: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
ad10: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
ad20: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
ad30: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
ad40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
ad50: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
ad60: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
ad70: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
ad80: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
ad90: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
ada0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
adb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
adc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
add0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
ade0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
adf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ae00: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
ae10: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
ae20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ae30: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
ae40: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
ae50: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
ae60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
ae70: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
ae80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
ae90: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
aea0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
aeb0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
aec0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
aed0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
aee0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
aef0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
af00: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
af10: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
af20: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
af30: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
af40: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
af50: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
af60: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
af70: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
af80: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
af90: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
afa0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
afb0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
afc0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
afd0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
afe0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
aff0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
b000: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
b010: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
b020: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
b030: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
b040: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
b050: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
b060: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
b070: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
b080: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
b090: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
b0a0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
b0b0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
b0c0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
b0d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
b0e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
b0f0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
b100: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
b110: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
b120: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
b130: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
b140: 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a    i64 jrnlSize;.
b150: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
b160: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
b170: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
b180: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
b190: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
b1a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
b1b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b1c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
b1d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
b1e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
b1f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b200: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
b210: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
b220: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
b230: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
b240: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
b250: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
b260: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
b270: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
b280: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b290: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
b2a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
b2b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
b2c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
b2d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b2e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
b2f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
b300: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
b310: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
b320: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
b330: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
b340: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
b350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
b360: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
b370: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b380: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
b390: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
b3a0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
b3b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b3c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
b3d0: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
b3e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b3f0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
b400: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
b410: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
b420: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
b430: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
b440: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
b450: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
b460: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
b470: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
b480: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
b490: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
b4a0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
b4b0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
b4c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b4d0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b4e0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
b4f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
b500: 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f  rnlOff);.  jrnlO
b510: 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61  ff += 8+sizeof(a
b520: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
b530: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b540: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
b550: 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ync;..  /* If th
b560: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
b570: 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
b580: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
b590: 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
b5a0: 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
b5b0: 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
b5c0: 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
b5d0: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
b5e0: 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
b5f0: 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
b600: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
b610: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
b620: 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
b630: 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
b640: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
b650: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
b660: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
b670: 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
b680: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b690: 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
b6a0: 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
b6b0: 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
b6c0: 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
b6d0: 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
b6e0: 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
b6f0: 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
b700: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
b710: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
b720: 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
b730: 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
b740: 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
b750: 4b 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73  K).   && (rc = s
b760: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b770: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b780: 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54  rnlSize))==SQLIT
b790: 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53  E_OK.   && jrnlS
b7a0: 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b  ize>jrnlOff.  ){
b7b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b7c0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b7d0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
b7e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b7f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
b800: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
b810: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
b820: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
b830: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
b840: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b850: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
b860: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
b870: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
b880: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
b890: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
b8a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b8b0: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
b8c0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  e sqlite3PagerSt
b8d0: 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  mtCommit().** ro
b8e0: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
b8f0: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
b900: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
b910: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
b920: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
b930: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
b940: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
b950: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
b960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b970: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
b980: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
b990: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
b9a0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
b9b0: 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
b9c0: 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
b9d0: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
b9e0: 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42  .  assert( MEMDB
b9f0: 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74   );.  if( !pHist
ba00: 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  ->inStmt ){.    
ba10: 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
ba20: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
ba30: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Hist->pNextStmt=
ba40: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
ba50: 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  ager->pStmt ){. 
ba60: 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49       PGHDR_TO_HI
ba70: 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  ST(pPager->pStmt
ba80: 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76  , pPager)->pPrev
ba90: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
baa0: 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65  }.    pHist->pNe
bab0: 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d  xtStmt = pPager-
bac0: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67  >pStmt;.    pPag
bad0: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
bae0: 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74  .    pHist->inSt
baf0: 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mt = 1;.  }.}../
bb00: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
bb10: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
bb20: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
bb30: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
bb40: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
bb50: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
bb60: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
bb70: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
bb80: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
bb90: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
bba0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
bbb0: 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67  r *p;.  if( pPag
bbc0: 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72  er->aHash==0 ) r
bbd0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70  eturn 0;.  p = p
bbe0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e  Pager->aHash[pgn
bbf0: 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
bc00: 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28  sh-1)];.  while(
bc10: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
bc20: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
bc30: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
bc40: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
bc50: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
bc60: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
bc70: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
bc80: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
bc90: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
bca0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
bcb0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
bcc0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
bcd0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
bce0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
bcf0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
bd00: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
bd10: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
bd20: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
bd30: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
bd40: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
bd50: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
bd60: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
bd70: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
bd80: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
bd90: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
bda0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
bdb0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
bdc0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
bdd0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
bde0: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
bdf0: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
be00: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
be10: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
be20: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
be30: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
be40: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
be50: 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
be60: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
be70: 33 50 61 67 65 46 72 65 65 28 70 50 67 2d 3e 70  3PageFree(pPg->p
be80: 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
be90: 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
bea0: 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  }.  assert(pPage
beb0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30  r->lru.pFirst==0
bec0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
bed0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
bee0: 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65  nced==0);.  asse
bef0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
bf00: 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67  Last==0);.  pPag
bf10: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
bf20: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
bf30: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69  0;.  pPager->pDi
bf40: 72 74 79 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rty = 0;.  pPage
bf50: 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->nHash = 0;.  
bf60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
bf70: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
bf80: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
bf90: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
bfa0: 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  h = 0;.  pPager-
bfb0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nRef = 0;.}../*
bfc0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
bfd0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
bfe0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
bff0: 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
c000: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
c010: 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
c020: 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63  nts of .** the c
c030: 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74  ache and reset t
c040: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
c050: 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  re internal stat
c060: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  e. If there is.*
c070: 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  * an open journa
c080: 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  l-file, then the
c090: 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61   next time a sha
c0a0: 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61  red-lock is obta
c0b0: 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70  ined.** on the p
c0c0: 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68  ager file (by th
c0d0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
c0e0: 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c  process), it wil
c0f0: 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20  l be.** treated 
c100: 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
c110: 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b   and rolled back
c120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c130: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
c140: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c150: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
c160: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
c170: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
c180: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f        int rc = o
c190: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
c1a0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
c1b0: 20 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61      if( rc ) pPa
c1c0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
c1d0: 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
c1e0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
c1f0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c200: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c210: 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20 41  er))..      /* A
c220: 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20  lways close the 
c230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
c240: 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
c250: 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20  atabase lock..  
c260: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
c270: 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  , another connec
c280: 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
c290: 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
c2a0: 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c  ght.      ** del
c2b0: 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74  ete the file out
c2c0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
c2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
c2e0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
c2f0: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
c300: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c310: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
c320: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
c330: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
c340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
c350: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c360: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c370: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
c380: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
c390: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c3a0: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
c3b0: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
c3c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c3d0: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
c3e0: 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  not be.      ** 
c3f0: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
c400: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
c410: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
c420: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c430: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
c440: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
c450: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
c460: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
c470: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
c480: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c490: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
c4a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c4b0: 45 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65  E_OK ) pPager->e
c4c0: 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
c4d0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  OK;.        page
c4e0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
c4f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
c500: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
c510: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c520: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c530: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20  ->stfd);.       
c540: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
c550: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
c560: 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  pInStmt);.      
c570: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53      pPager->pInS
c580: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
c590: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
c5a0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
c5b0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c5c0: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
c5d0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
c5f0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c600: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
c610: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c620: 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
c630: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
c640: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c650: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
c660: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
c670: 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MDB || pPager->e
c680: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
c690: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
c6a0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c6b0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
c6c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
c6d0: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
c6e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
c6f0: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
c700: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
c710: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
c720: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
c730: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
c740: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
c750: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
c760: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
c770: 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65   .** do not atte
c780: 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  mpt the rollback
c790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c7a0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
c7b0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
c7c0: 29 7b 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20  ){.  /* assert( 
c7d0: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
c7e0: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a  RESERVED || p->j
c7f0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
c800: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 65 72 72   */.  if( p->err
c810: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
c820: 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  && p->state>=PAG
c830: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
c840: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
c850: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
c860: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
c870: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20  ollback(p);.    
c880: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
c890: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
c8a0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b  pager_unlock(p);
c8b0: 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
c8c0: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
c8d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  p->journalOpen |
c8e0: 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d  | (p->exclusiveM
c8f0: 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c  ode&&!p->journal
c900: 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Off) );.  assert
c910: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
c920: 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20  !p->stmtOpen || 
c930: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
c940: 20 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   );.#endif.}../*
c950: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c960: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
c970: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
c980: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
c990: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
c9a0: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
c9b0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
c9c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c9d0: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
c9e0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
c9f0: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
ca00: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
ca10: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
ca20: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
ca30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
ca40: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
ca50: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
ca60: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
ca70: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
ca80: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
ca90: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
caa0: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
cab0: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
cac0: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
cad0: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
cae0: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
caf0: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
cb00: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
cb10: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
cb20: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
cb30: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
cb40: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
cb50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
cb60: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
cb70: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
cb80: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
cb90: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
cba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cbb0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
cbc0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
cbd0: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
cbe0: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
cbf0: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
cc00: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
cc10: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
cc20: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
cc30: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
cc40: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
cc50: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
cc60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
cc70: 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 50   hasMaster){.  P
cc80: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
cc90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cca0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
ccb0: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
ccc0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
ccd0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
cce0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
ccf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
cd00: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
cd10: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
cd20: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
cd30: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
cd40: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
cd50: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
cd60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
cd70: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
cd80: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
cd90: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
cda0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
cdb0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
cdc0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
cdd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
cde0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
cdf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ce00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
ce10: 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20  SIST.    ){.    
ce20: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
ce30: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
ce40: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
ce50: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
ce60: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
ce70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ce80: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
ce90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
cea0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
ceb0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
cec0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
ced0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
cee0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
cef0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
cf00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cf10: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
cf20: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
cf30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cf40: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cf50: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cf60: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cf70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cf80: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
cf90: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
cfa0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
cfb0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
cfc0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
cfd0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
cfe0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
cff0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
d000: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
d010: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
d020: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
d030: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
d040: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
d050: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
d060: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
d070: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
d080: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
d090: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
d0a0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
d0b0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
d0c0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
d0d0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
d0e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
d0f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
d100: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d110: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
d120: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
d130: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
d140: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
d150: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
d160: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
d170: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
d180: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d190: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
d1a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
d1b0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
d1c0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
d1d0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
d1e0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
d1f0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
d200: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d210: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
d220: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d230: 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74  c = 0;.  lruList
d240: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
d250: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
d260: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
d270: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
d280: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ied = 0;..  retu
d290: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
d2a0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
d2b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
d2c0: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
d2d0: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
d2e0: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
d2f0: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d300: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
d310: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d320: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d330: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d340: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
d350: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
d360: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
d370: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
d380: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
d390: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
d3a0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
d3b0: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
d3c0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
d3d0: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
d3e0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
d3f0: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
d400: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
d410: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
d420: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
d430: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
d440: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
d450: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d460: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d470: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d480: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
d490: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
d4a0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
d4b0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
d4c0: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
d4d0: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
d4e0: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
d4f0: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
d500: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
d510: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
d520: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
d530: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
d540: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
d550: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
d560: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
d570: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
d580: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
d590: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
d5a0: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
d5b0: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
d5c0: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
d5d0: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
d5e0: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
d5f0: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
d600: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
d610: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
d620: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
d630: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
d640: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
d650: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
d660: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
d670: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
d680: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
d690: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
d6a0: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
d6b0: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
d6c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d6d0: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
d6e0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
d6f0: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
d700: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
d710: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
d720: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
d730: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
d740: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d750: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d760: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d770: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d780: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
d790: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
d7a0: 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
d7b0: 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f  lean(PgHdr*);../
d7c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
d7d0: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
d7e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
d7f0: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
d800: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
d810: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
d820: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
d830: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
d840: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
d850: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
d860: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
d870: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
d880: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
d890: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
d8a0: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
d8b0: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
d8c0: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
d8d0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
d8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8f0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d900: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
d910: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c   *pPager, .  sql
d920: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a  ite3_file *jfd,.
d930: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20    i64 offset,.  
d940: 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a  int useCksum.){.
d950: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
d960: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
d970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
d980: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
d990: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
d9a0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d9c0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
d9d0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
d9e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
d9f0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
da00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
da10: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
da20: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
da30: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
da40: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
da50: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
da60: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
da70: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73  page */..  /* us
da80: 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65  eCksum should be
da90: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
daa0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
dab0: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
dac0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
dad0: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
dae0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
daf0: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
db00: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73  sert( jfd == (us
db10: 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d  eCksum ? pPager-
db20: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
db30: 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tfd) );.  assert
db40: 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63  ( aData );..  rc
db50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
db60: 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f  d, offset, &pgno
db70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
db80: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
db90: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
dba0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
dbb0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
dbc0: 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
dbd0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
dbe0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
dbf0: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
dc00: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
dc10: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
dc20: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
dc30: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
dc40: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
dc50: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
dc60: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
dc70: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
dc80: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
dc90: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
dca0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
dcb0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
dcc0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
dcd0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
dce0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
dcf0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
dd00: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
dd10: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
dd20: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
dd30: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
dd40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
dd50: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
dd60: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
dd70: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
dd80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dd90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
dda0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
ddb0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
ddc0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
ddd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
dde0: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
ddf0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
de00: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
de10: 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
de20: 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
de30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
de40: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
de50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
de60: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
de70: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
de80: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
de90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dea0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
deb0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
dec0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
ded0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
dee0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
def0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
df00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
df10: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
df20: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
df30: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
df40: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
df50: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
df60: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
df70: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
df80: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
df90: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
dfa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
dfb0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
dfc0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
dfd0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
dfe0: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
dff0: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
e000: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
e010: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
e020: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
e030: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
e040: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
e050: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
e060: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
e070: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
e080: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e090: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
e0a0: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
e0b0: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
e0c0: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
e0d0: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
e0e0: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
e0f0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
e100: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
e110: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
e120: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
e130: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
e140: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
e150: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
e160: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
e170: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
e180: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e190: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
e1a0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
e1b0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
e1c0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
e1d0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
e1e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
e1f0: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
e200: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
e210: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
e220: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
e230: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
e240: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
e250: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
e260: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
e270: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
e280: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
e290: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
e2a0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
e2b0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
e2c0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
e2d0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
e2e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
e2f0: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
e300: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
e310: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
e320: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
e330: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
e340: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
e350: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
e360: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
e370: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
e380: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
e390: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
e3a0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
e3b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
e3c0: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
e3d0: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
e3e0: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
e3f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
e400: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
e410: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
e420: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
e430: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
e440: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
e450: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
e460: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
e470: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
e480: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
e490: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
e4a0: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
e4b0: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
e4c0: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
e4d0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
e4e0: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
e4f0: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
e500: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
e510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
e520: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
e530: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
e540: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
e550: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
e560: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
e570: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20  Sync==0..  **.  
e580: 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20  ** 2008-04-14:  
e590: 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  When attempting 
e5a0: 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72  to vacuum a corr
e5b0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
e5c0: 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  e, it.  ** is po
e5d0: 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61  ssible to fail a
e5e0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20   statement on a 
e5f0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f  database that do
e600: 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
e610: 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  ..  ** Do not at
e620: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69  tempt to write i
e630: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
e640: 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f  has never been o
e650: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
e660: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
e670: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
e680: 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50    PAGERTRACE4("P
e690: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
e6a0: 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
e6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e6c0: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
e6d0: 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
e6e0: 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
e6f0: 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29  ageSize, aData))
e700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e710: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
e720: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
e730: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
e740: 6e 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26  nc==0).        &
e750: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
e760: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
e770: 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
e780: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
e790: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
e7a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e7b0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
e7c0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e7d0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
e7e0: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
e7f0: 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
e800: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
e810: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
e820: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
e830: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
e840: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
e850: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
e860: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
e870: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
e880: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
e890: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
e8a0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
e8b0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
e8c0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
e8d0: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
e8e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
e8f0: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
e900: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
e910: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
e920: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
e930: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
e940: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
e950: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
e960: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
e970: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
e980: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
e990: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
e9a0: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
e9b0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
e9c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
e9d0: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
e9e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
e9f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
ea00: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
ea10: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ea20: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
ea30: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
ea40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
ea50: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
ea60: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
ea70: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ea80: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
ea90: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
eaa0: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
eab0: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
eac0: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
ead0: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
eae0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
eaf0: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
eb00: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
eb10: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
eb20: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
eb30: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
eb40: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
eb50: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
eb60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
eb70: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
eb80: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
eb90: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
eba0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
ebb0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
ebc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ebd0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
ebe0: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
ebf0: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
ec00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
ec10: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
ec20: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
ec30: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
ec40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ec50: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
ec60: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
ec70: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
ec80: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
ec90: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
eca0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ecb0: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
ecc0: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
ecd0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
ece0: 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
ecf0: 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
ed00: 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
ed10: 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
ed20: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
ed30: 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
ed40: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ction..**.**.** 
ed50: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
ed60: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
ed70: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
ed80: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
ed90: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
eda0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
edb0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
edc0: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
edd0: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
ede0: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
edf0: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
ee00: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
ee10: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
ee20: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
ee30: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
ee40: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
ee50: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
ee60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ee70: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
ee80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ee90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
eea0: 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
eeb0: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
eec0: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
eed0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
eee0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  open = 0;.  sqli
eef0: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
ef00: 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r;.  sqlite3_fil
ef10: 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63  e *pJournal;.  c
ef20: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
ef30: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
ef40: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
ef50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
ef60: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
ef70: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
ef80: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
ef90: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
efa0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
efb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
efc0: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
efd0: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
efe0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
eff0: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
f000: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
f010: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
f020: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
f030: 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
f040: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
f050: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
f060: 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
f070: 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
f080: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
f090: 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
f0a0: 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
f0b0: 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
f0c0: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
f0d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f0e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f0f0: 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
f100: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
f110: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
f120: 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
f130: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f140: 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
f150: 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
f160: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
f170: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
f180: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
f190: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
f1a0: 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 1;..  rc = sq
f1b0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
f1c0: 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
f1d0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
f1e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f1f0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f200: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
f210: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
f220: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
f230: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
f240: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
f250: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
f260: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d   = pPager->pVfs-
f270: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a  >mxPathname+1;..
f280: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
f290: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
f2a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
f2b0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
f2c0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
f2d0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
f2e0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
f2f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
f300: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
f310: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
f320: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
f330: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
f340: 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
f350: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
f360: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
f370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f380: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
f390: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f3a0: 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
f3b0: 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
f3c0: 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
f3d0: 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
f3e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
f3f0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
f400: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
f410: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
f420: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f430: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f440: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
f450: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
f460: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
f470: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
f480: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
f490: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
f4a0: 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
f4b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f4c0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f4d0: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
f4e0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
f4f0: 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69  exists);.      i
f500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f510: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
f520: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f540: 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
f550: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
f560: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
f570: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
f580: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
f590: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
f5a0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
f5b0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
f5c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f5d0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
f5e0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
f5f0: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
f600: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f610: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
f620: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
f630: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
f640: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
f650: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
f660: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
f670: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
f680: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f690: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
f6a0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
f6b0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
f6c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f6e0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f6f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f700: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
f710: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
f720: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
f730: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
f740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f750: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
f760: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f780: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
f790: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
f7a0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
f7b0: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
f7c0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
f7d0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
f7e0: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
f7f0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
f800: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
f810: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
f820: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f830: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
f840: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
f850: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
f860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f870: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
f880: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
f890: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
f8a0: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
f8b0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f8c0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
f8d0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
f8e0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
f8f0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
f900: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
f910: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
f920: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
f930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
f940: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
f950: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
f960: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f970: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
f980: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
f990: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
f9a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
f9b0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
f9c0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
f9d0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
f9e0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f9f0: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
fa00: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
fa10: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
fa20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
fa30: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
fa40: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
fa50: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
fa60: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
fa70: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
fa80: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
fa90: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
faa0: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
fab0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
fac0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
fad0: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
fae0: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
faf0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
fb00: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
fb10: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
fb20: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
fb30: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
fb40: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
fb50: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
fb60: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
fb70: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
fb80: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
fb90: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
fba0: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
fbb0: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
fbc0: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
fbd0: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
fbe0: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
fbf0: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
fc00: 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
fc10: 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74  e zero byte to t
fc20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
fc30: 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  w.** file instea
fc40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
fc50: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
fc60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
fc70: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
fc80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fc90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
fca0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
fcb0: 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d  USIVE && pPager-
fcc0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
fcd0: 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
fce0: 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
fcf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fd00: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
fd10: 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
fd20: 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
fd30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
fd40: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
fd50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fd60: 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
fd70: 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
fd80: 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
fd90: 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
fda0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fdb0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
fdc0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
fdd0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
fde0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
fdf0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
fe00: 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
fe10: 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
fe20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fe30: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
fe40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
fe50: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
fe60: 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
fe70: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
fe80: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
fe90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fea0: 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69  Set the sectorSi
feb0: 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ze for the given
fec0: 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pager..**.** Th
fed0: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
fee0: 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67   at least as big
fef0: 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   as the sector s
ff00: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
ff10: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
ff20: 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d  orSize().  The m
ff30: 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69  inimum sector si
ff40: 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74  ze is 512..*/.st
ff50: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
ff60: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
ff70: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
ff80: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
ff90: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
ffa0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
ffb0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
ffc0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
ffd0: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
ffe0: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
fff0: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
10000 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
10010 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
10020 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
10030 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
10040 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
10050 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
10060 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
10070 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10080 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
10090 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
100a0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
100b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
100c0 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b  ectorSize<512 ){
100d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
100e0 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
100f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
10100 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
10110 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
10120 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
10130 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
10140 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
10150 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
10160 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
10170 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
10180 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
10190 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
101a0 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
101b0 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
101c0 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
101d0 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
101e0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
101f0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
10200 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10210 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
10220 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
10230 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
10240 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
10250 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
10260 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
10270 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
10280 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
10290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
102a0 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
102b0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
102c0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
102d0 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
102e0 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
102f0 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
10300 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
10310 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
10320 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
10330 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
10340 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
10350 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
10360 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
10370 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
10380 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
10390 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
103a0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
103b0 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
103c0 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
103d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
103e0 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
103f0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
10400 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
10410 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37  age case..**  (7
10420 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
10430 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10440 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10450 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
10460 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
10470 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
10480 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
10490 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
104a0 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
104b0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
104c0 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73  **  (8)  N bytes
104d0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
104e0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
104f0 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
10500 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
10510 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
10520 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
10530 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10540 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
10550 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
10560 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
10570 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
10580 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
10590 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
105a0 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
105b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
105c0 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
105d0 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f  .**  (9)  Zero o
105e0 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
105f0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
10600 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
10610 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
10620 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
10630 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
10640 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
10650 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
10660 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
10670 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
10680 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
10690 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
106a0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
106b0 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   8 items above..
106c0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
106d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
106e0 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
106f0 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 9th item..**.
10700 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
10710 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
10720 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
10730 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
10740 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
10750 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
10760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
10770 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
10780 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
10790 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
107a0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
107b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
107c0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
107d0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
107e0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
107f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
10800 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
10810 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
10820 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
10830 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
10840 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
10850 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
10860 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
10870 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
10880 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
10890 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
108a0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
108b0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
108c0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
108d0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
108e0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
108f0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
10900 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
10910 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
10920 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
10930 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
10940 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
10950 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
10960 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
10970 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
10980 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
10990 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
109a0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
109b0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
109c0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
109d0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
109e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
109f0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
10a00 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
10a10 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
10a20 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
10a30 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
10a40 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
10a50 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
10a60 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
10a70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
10a80 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
10a90 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
10aa0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
10ab0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10ac0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
10ad0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
10ae0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
10af0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
10b00 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
10b10 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
10b20 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
10b30 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
10b40 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
10b50 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
10b60 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
10b70 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
10b80 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
10b90 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
10ba0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
10bb0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
10bc0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
10bd0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
10be0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
10bf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
10c00 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
10c10 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
10c20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
10c50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10c60 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
10c70 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
10c80 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
10c90 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
10ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10cb0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10cc0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
10cd0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10cf0 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
10d00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
10d10 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d30 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10d40 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
10d50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10d60 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
10d70 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
10d80 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
10db0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
10dc0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10de0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
10df0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
10e00 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
10e10 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
10e20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
10e30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10e40 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
10e50 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
10e60 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
10e70 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
10e80 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
10e90 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
10ea0 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
10eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10ec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
10ed0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10ee0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
10ef0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
10f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10f10 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
10f20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10f30 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
10f40 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
10f50 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
10f60 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
10f70 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
10f80 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
10f90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10fa0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
10fb0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
10fc0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
10fd0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
10fe0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
10ff0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
11000 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
11010 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
11020 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  k..  */.  zMaste
11030 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
11040 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
11050 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
11060 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11070 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
11080 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
11090 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
110a0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
110b0 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
110c0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
110d0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
110e0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
110f0 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
11100 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
11110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11120 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
11130 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
11140 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
11150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11160 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
11170 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
11180 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
11190 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
111a0 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
111b0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
111c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
111d0 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
111e0 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
111f0 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
11200 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
11210 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11220 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
11230 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
11240 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
11250 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11260 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
11270 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
11280 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
11290 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
112a0 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
112b0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
112c0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
112d0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
112e0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
112f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
11300 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
11310 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
11320 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
11330 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
11340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11350 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
11360 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
11370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
11380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
11390 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
113a0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
113b0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
113c0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
113d0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
113e0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
113f0 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
11400 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
11410 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
11420 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
11430 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
11440 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
11450 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
11460 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
11470 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
11480 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
11490 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
114a0 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
114b0 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
114c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
114d0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
114e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
114f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11500 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
11510 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
11520 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
11530 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
11540 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
11550 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
11560 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11570 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
11580 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
11590 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
115a0 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
115b0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
115c0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
115d0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
115e0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
115f0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
11600 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
11610 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
11620 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
11630 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
11640 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
11650 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
11660 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
11670 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
11680 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
11690 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
116a0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
116b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
116c0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
116d0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
116e0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
116f0 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  2565..    */.   
11700 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
11710 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
11720 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11730 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
11740 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
11750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11760 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
11770 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
11780 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
11790 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
117a0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
117b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
117c0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
117d0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
117e0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
117f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11800 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
11810 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
11820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11840 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
11850 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
11860 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11870 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11880 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
11890 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
118a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
118b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
118c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
118d0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
118e0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
118f0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
11900 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
11910 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
11920 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11930 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
11940 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11950 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11960 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11970 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11980 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11990 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
119a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
119b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
119c0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
119d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
119e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
119f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11a00 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
11a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11a30 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
11a40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11a50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11a60 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
11a70 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
11a80 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
11a90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11aa0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
11ab0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
11ac0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
11ad0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11ae0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
11af0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
11b00 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
11b10 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
11b20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11b30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
11b40 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
11b50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
11b60 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69  !='\0');.  }.  i
11b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11b80 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
11b90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
11ba0 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
11bb0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
11bc0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
11bd0 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
11be0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
11bf0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
11c00 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11c10 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
11c20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
11c30 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
11c40 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
11c50 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
11c60 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11c70 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
11c80 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
11c90 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
11ca0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
11cb0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
11cc0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
11cd0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
11ce0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
11cf0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
11d00 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
11d10 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
11d20 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11d30 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
11d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
11d50 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
11d60 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
11d70 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
11d80 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
11d90 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
11da0 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
11db0 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
11dc0 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
11dd0 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
11de0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
11df0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11e00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
11e10 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
11e20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
11e30 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
11e40 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
11e50 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
11e60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
11e70 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
11e80 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
11e90 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
11ea0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11eb0 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
11ec0 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
11ed0 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
11ee0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11ef0 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
11f00 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
11f10 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
11f20 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
11f30 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
11f40 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
11f50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
11f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11f70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
11f80 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
11f90 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
11fa0 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11fc0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
11fd0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12000 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
12010 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
12020 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74  alOff;..  /* Set
12030 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
12040 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
12050 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
12060 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
12070 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
12080 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
12090 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
120a0 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
120b0 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
120c0 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
120d0 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
120e0 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
120f0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
12100 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
12110 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
12120 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
12130 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
12140 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
12150 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
12160 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
12170 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
12180 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
12190 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
121a0 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
121b0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
121c0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
121d0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
121e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
121f0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
12200 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
12210 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
12220 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
12230 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
12240 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
12250 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
12260 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
12270 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
12280 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12290 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d  Open );.  nRec =
122a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
122b0 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
122c0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
122d0 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
122e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
122f0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
12300 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
12310 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
12320 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
12330 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
12340 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
12350 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
12360 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
12370 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
12380 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
12390 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
123a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
123b0 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
123c0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
123d0 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  = i*(4+pPager->p
123e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63  ageSize);.    rc
123f0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
12400 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
12410 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
12420 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20   offset, 0);.   
12430 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12440 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
12450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12460 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
12470 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
12480 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
12490 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
124a0 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
124b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
124c0 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
124d0 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
124e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
124f0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
12500 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
12510 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
12520 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
12530 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
12540 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
12550 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
12560 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
12570 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
12580 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
12590 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
125a0 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
125b0 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
125c0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
125d0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
125e0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
125f0 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
12600 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
12610 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
12620 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
12630 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
12640 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
12650 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
12660 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
12670 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20  Cksum;.  while( 
12680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12690 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20  ff < hdrOff ){. 
126a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
126b0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
126c0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
126d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
126e0 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
126f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12700 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
12710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12720 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
12730 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
12740 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
12750 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
12760 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
12770 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
12780 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
12790 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
127a0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
127b0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
127c0 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
127d0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
127e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
127f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12800 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12810 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
12820 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
12830 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
12840 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
12850 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
12860 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
12870 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
12880 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12890 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
128a0 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
128b0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
128c0 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
128d0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
128e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
128f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
12900 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
12910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12920 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
12930 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
12940 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
12950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12960 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
12970 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
12980 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
12990 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
129a0 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
129b0 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
129c0 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20  SQLITE_OK) {.   
129d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
129e0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
129f0 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
12a00 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
12a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
12a30 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
12a40 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
12a50 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
12a60 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
12a70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
12a80 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
12a90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
12aa0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
12ab0 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
12ac0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
12ad0 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
12ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
12af0 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
12b00 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
12b10 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
12b20 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
12b30 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
12b40 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
12b50 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
12b60 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
12b70 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
12b80 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
12b90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12ba0 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
12bb0 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
12bc0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
12bd0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
12be0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
12bf0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12c00 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
12c10 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
12c20 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
12c30 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
12c40 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
12c50 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
12c60 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
12c70 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
12c80 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12c90 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
12ca0 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
12cb0 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
12cc0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
12cd0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
12ce0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
12cf0 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
12d00 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
12d20 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
12d30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
12d40 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
12d50 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
12d60 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
12d70 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
12d80 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
12d90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
12da0 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
12db0 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
12dc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
12dd0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
12de0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
12df0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
12e00 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12e10 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12e20 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
12e30 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12e40 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
12e50 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
12e60 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
12e70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
12e80 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
12e90 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
12ea0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12eb0 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
12ec0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
12ed0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
12ee0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
12ef0 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
12f00 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
12f10 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
12f20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
12f30 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
12f40 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
12f50 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
12f60 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12f70 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
12f80 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
12f90 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
12fa0 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
12fb0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
12fc0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12fd0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
12fe0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
12ff0 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
13000 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
13010 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
13020 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
13030 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
13040 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
13050 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
13060 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  l, int full_fsyn
13070 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
13080 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
13090 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
130a0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
130b0 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
130c0 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
130d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
130e0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
130f0 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c   (full_fsync?SQL
13100 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
13110 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
13120 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13130 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
13140 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13150 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13160 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
13170 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
13180 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
13190 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
131a0 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
131b0 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
131c0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
131d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
131e0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
131f0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
13200 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
13210 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
13220 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
13230 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
13240 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
13250 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
13260 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
13270 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13280 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
13290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
132a0 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
132b0 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
132c0 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
132d0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
132e0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
132f0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  e the temporary.
13300 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ** file when it 
13310 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  is closed..*/.st
13320 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
13330 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  PagerOpentemp(. 
13340 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
13350 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13360 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
13370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
13380 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
13390 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
133a0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
133b0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
133c0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
133d0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
133e0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
133f0 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
13400 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
13410 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
13420 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
13430 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
13440 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
13450 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
13460 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
13470 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
13480 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13490 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
134a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
134b0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
134c0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
134d0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
134e0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
134f0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
13500 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
13510 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
13520 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  TE_OK || pFile->
13530 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65  pMethods );.  re
13540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13550 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
13560 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
13570 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
13580 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
13590 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
135a0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
135b0 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
135c0 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
135d0 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
135e0 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
135f0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
13600 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
13610 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
13620 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
13630 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
13640 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
13650 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
13660 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
13670 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
13680 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
13690 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
136a0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
136b0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
136c0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
136d0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
136e0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
136f0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
13700 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
13710 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
13720 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
13730 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
13740 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
13750 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
13760 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
13770 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
13780 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
13790 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
137a0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
137b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
137c0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
137d0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
137e0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
137f0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
13800 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
13810 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
13820 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
13830 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
13840 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
13850 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
13860 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
13880 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
13890 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
138a0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
138b0 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
138c0 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
138d0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
138e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
138f0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
13900 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
13910 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13930 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
13940 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
13950 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
13960 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
13970 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
13980 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
13990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
139a0 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
139b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
139c0 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
139d0 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
139e0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
139f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
13a00 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
13a10 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
13a20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
13a30 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
13a40 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  ;.  int journalF
13a50 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
13a60 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
13a70 73 29 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67 65  s);.  int szPage
13a80 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
13a90 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13aa0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
13ab0 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  me = 0;.  int nP
13ac0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  athname = 0;..  
13ad0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72  /* The default r
13ae0 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20  eturn is a NULL 
13af0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70  pointer */.  *pp
13b00 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
13b10 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
13b20 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
13b30 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
13b40 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
13b50 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
13b60 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
13b70 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
13b80 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
13b90 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
13ba0 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
13bb0 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
13bc0 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
13bd0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13be0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13bf0 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
13c00 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13c10 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
13c20 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
13c30 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
13c40 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
13c50 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
13c60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13c70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
13c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c90 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
13ca0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
13cb0 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
13cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
13cd0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
13ce0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
13cf0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
13d00 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  f.    {.      rc
13d10 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
13d20 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
13d30 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13d40 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
13d50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13d80 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
13d90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13da0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e      }.    nPathn
13db0 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61  ame = strlen(zPa
13dc0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  thname);.  }..  
13dd0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
13de0 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  ry for the pager
13df0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
13e00 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
13e10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
13e20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
13e30 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
13e40 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
13e50 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
13e60 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
13e70 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
13e80 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
13e90 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
13ea0 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20  OsFile * 3 +    
13eb0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
13ec0 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e  db and two journ
13ed0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
13ee0 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   3*nPathname + 4
13ef0 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
13f00 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
13f10 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20  ctory, zJournal 
13f20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
13f30 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
13f40 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13f50 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13f60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13f70 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20   }.  pPtr = (u8 
13f80 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
13f90 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13fa0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70   = vfsFlags;.  p
13fb0 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c  Pager->fd = (sql
13fc0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13fd0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13fe0 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  0];.  pPager->st
13ff0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
14000 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
14010 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70  szOsFile*1];.  p
14020 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71  Pager->jfd = (sq
14030 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
14040 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
14050 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  *2];.  pPager->z
14060 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
14070 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
14080 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c  OsFile*2+journal
14090 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
140a0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
140b0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
140c0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
140d0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
140e0 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
140f0 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
14100 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
14110 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
14120 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
14130 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
14140 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14150 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
14160 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73  thname+1);.    s
14170 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
14180 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
14190 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
141a0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
141b0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
141c0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
141d0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
141e0 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
141f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73  ->mxPathname - s
14200 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
14210 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
14220 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
14230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14240 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
14250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14260 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
14270 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14280 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
142b0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
142c0 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
142d0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
142e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
142f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
14300 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
14310 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
14320 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
14330 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
14340 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
14350 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
14360 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
14370 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
14380 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
14390 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
143a0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
143b0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
143c0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
143d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
143e0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
143f0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
14400 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
14410 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
14420 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
14430 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
14440 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
14450 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
14460 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
14470 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14480 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
14490 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
144a0 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
144b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
144c0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
144d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
144e0 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f  zPageDflt<iSecto
144f0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
14500 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
14510 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  iSectorSize;.   
14520 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
14530 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
14540 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
14550 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
14560 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
14570 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
14580 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
14590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
145a0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
145b0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
145c0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
145d0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
145e0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
145f0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
14600 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
14610 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
14620 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14630 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
14640 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
14650 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
14660 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
14670 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
14680 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
14690 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
146a0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
146b0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
146c0 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20   ) szPageDflt = 
146d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
146e0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
146f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
14700 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d  ageDflt>SQLITE_M
14710 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
14720 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
14730 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
14740 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
14750 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
14760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14770 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14780 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f   !memDb ){.    /
14790 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
147a0 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
147b0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
147c0 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
147d0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
147e0 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
147f0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
14800 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
14810 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
14820 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
14830 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
14840 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
14850 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ()..    */ .    
14860 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
14870 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
14880 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
14890 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  E;.  }..  if( pP
148a0 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  ager && rc==SQLI
148b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
148c0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
148d0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
148e0 6f 63 28 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a  oc(szPageDflt);.
148f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
14900 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
14910 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
14920 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a  locks above..  *
14930 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72  * Free the Pager
14940 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
14950 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
14960 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61   ** Since the pa
14970 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
14980 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
14990 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
149a0 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
149b0 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
149c0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
149d0 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  er || !pPager->p
149e0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
149f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
14a00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
14a10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
14a20 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
14a30 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
14a40 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
14a50 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
14a60 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
14a70 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
14a80 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
14a90 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
14aa0 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
14ab0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
14ac0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
14ad0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f  zFilename))..  /
14ae0 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
14af0 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a  zDirectory[] */.
14b00 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
14b10 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61  >zDirectory, pPa
14b20 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
14b30 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
14b40 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61  for(i=strlen(pPa
14b50 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
14b60 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
14b70 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
14b80 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
14b90 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
14ba0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
14bb0 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ] = 0;..  /* Fil
14bc0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72  l in Pager.zJour
14bd0 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a  nal[] */.  if( z
14be0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
14bf0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
14c00 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
14c10 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
14c20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
14c30 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
14c40 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
14c50 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b   "-journal", 9);
14c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
14c70 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
14c80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50   0;.  }..  /* pP
14c90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14ca0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
14cb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
14cc0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
14cd0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
14ce0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
14cf0 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
14d00 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
14d10 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
14d20 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
14d30 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
14d40 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14d50 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
14d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14d70 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
14d80 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 7a  r->pageSize = sz
14d90 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70  PageDflt;.  /* p
14da0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
14db0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14dc0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14dd0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14de0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
14df0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
14e00 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
14e10 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
14e20 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
14e30 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
14e40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
14e50 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
14e60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14e70 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
14e80 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14e90 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
14ea0 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
14eb0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
14ec0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
14ed0 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
14ee0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
14ef0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14f00 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
14f10 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
14f20 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
14f30 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
14f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
14f50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14f60 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
14f70 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
14f80 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
14f90 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
14fa0 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
14fb0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
14fc0 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
14fd0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
14fe0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
14ff0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
15000 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
15010 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
15020 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15030 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
15040 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
15050 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15060 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15070 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
15080 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
15090 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
150a0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
150b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
150c0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
150d0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
150e0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
150f0 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67  (nExtra);.  pPag
15100 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
15110 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
15120 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
15130 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
15140 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
15150 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c  Methods||memDb||
15160 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15170 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
15180 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15190 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
151a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
151b0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
151c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
151d0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
151e0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
151f0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
15200 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
15210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15220 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15230 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
15240 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  eMM = 0;.  pPage
15250 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  r->iInUseDB = 0;
15260 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
15270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15280 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
15290 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
152a0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
152b0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
152c0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
152d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
152e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
152f0 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50  r(mutex);.    pP
15300 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71  ager->pNext = sq
15310 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a  lite3PagerList;.
15320 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
15330 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  agerList ){.    
15340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15350 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65  3PagerList->pPre
15360 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  v==0 );.      sq
15370 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e  lite3PagerList->
15380 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a  pPrev = pPager;.
15390 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
153a0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
153b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
153c0 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  t = pPager;.    
153d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
153e0 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
153f0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
15400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15410 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
15420 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
15430 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
15440 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
15450 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
15460 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
15470 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
15480 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
15490 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
154a0 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
154b0 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
154c0 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
154d0 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
154e0 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
154f0 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
15500 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
15510 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
15520 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
15530 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
15540 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
15550 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
15560 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
15570 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
15580 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
15590 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
155a0 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
155b0 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
155c0 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  ult sqlite3Pager
155d0 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  Close().  .** De
155e0 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
155f0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
15600 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
15610 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15620 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63  3PagerSetDestruc
15630 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
15640 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
15650 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
15660 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
15670 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
15680 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15690 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
156a0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
156b0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
156c0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
156d0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
156e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
156f0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
15700 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
15710 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
15720 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
15730 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
15740 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
15750 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
15760 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
15770 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
15780 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
15790 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
157a0 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
157b0 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
157c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
157d0 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
157e0 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
157f0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
15800 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
15810 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
15820 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
15830 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
15840 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
15850 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
15860 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
15870 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
15880 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
15890 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
158a0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
158b0 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
158c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
158d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
158e0 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
158f0 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
15900 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
15910 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15920 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  K;.  u16 pageSiz
15930 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
15940 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
15950 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
15960 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
15970 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
15980 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
15990 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
159a0 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
159b0 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26  ->pageSize .   &
159c0 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
159d0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
159e0 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0 .  ){.    ch
159f0 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
15a00 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
15a10 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
15a20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
15a30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15a40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
15a50 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72  lse{.      pager
15a60 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
15a70 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
15a80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15a90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15aa0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
15ab0 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
15ac0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15ad0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
15ae0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15af0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
15b00 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
15b10 65 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c  ew;.      pagerL
15b20 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
15b30 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65    }.  }.  *pPage
15b40 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
15b50 61 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  ageSize;.  retur
15b60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
15b70 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
15b80 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
15b90 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
15ba0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
15bb0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
15bc0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
15bd0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
15be0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
15bf0 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
15c00 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
15c10 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
15c20 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
15c30 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
15c40 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
15c50 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
15c60 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
15c70 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
15c80 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
15c90 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
15ca0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
15cb0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
15cc0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
15cd0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
15ce0 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
15cf0 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
15d00 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
15d10 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
15d30 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
15d40 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
15d50 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
15d60 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
15d70 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
15d80 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
15d90 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
15da0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
15db0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
15dc0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
15dd0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
15de0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
15df0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
15e00 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
15e10 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
15e20 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
15e30 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
15e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
15e50 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
15e60 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
15e70 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
15e80 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
15e90 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
15ea0 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  age;.  }.  sqlit
15eb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15ec0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72  (pPager, 0);.  r
15ed0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
15ee0 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
15ef0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
15f00 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
15f10 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
15f20 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
15f30 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
15f40 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
15f50 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
15f60 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
15f70 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
15f80 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
15f90 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
15fa0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
15fb0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
15fc0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
15fd0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
15fe0 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
15ff0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
16000 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
16010 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
16020 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
16030 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
16040 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
16050 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
16060 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
16070 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
16080 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
16090 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
160a0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
160b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
160c0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
160d0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
160e0 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
160f0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
16100 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
16110 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
16120 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
16130 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
16140 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
16150 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
16160 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
16170 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
16180 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
16190 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
161a0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
161b0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
161c0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
161d0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
161e0 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
161f0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
16200 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
16210 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
16220 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
16230 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
16240 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
16250 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
16260 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
16270 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
16280 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
16290 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
162a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
162b0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
162c0 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
162d0 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
162e0 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
162f0 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
16300 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
16310 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
16320 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
16330 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
16340 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
16350 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
16360 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
16370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16380 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
16390 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
163a0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
163b0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
163c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
163d0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
163e0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
163f0 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50  assert(MEMDB||pP
16400 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
16410 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
16420 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61  File);.  if( pPa
16430 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
16440 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  s ){.    IOTRACE
16450 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
16460 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
16470 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16480 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
16490 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
164a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
164b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
164c0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
164d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
164e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
164f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16500 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
16510 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16520 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
16530 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16540 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
16550 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
16560 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
16570 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
16580 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
16590 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
165a0 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
165b0 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
165c0 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
165d0 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
165e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
165f0 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
16600 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
16610 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
16620 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
16630 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
16640 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
16650 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
16660 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
16670 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
16680 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
16690 61 67 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20  age){.  i64 n = 
166a0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  0;.  int rc;.  a
166b0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
166c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
166d0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
166e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
166f0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
16700 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
16710 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e>=0 ){.    n = 
16720 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
16730 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61    } else {.    a
16740 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
16750 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
16760 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
16770 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
16780 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20  fd->pMethods).  
16790 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
167a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
167b0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
167c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
167d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
167e0 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  +;.      pager_e
167f0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16800 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
16810 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65  nRef--;.      re
16820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16830 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
16840 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16850 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
16860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16870 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
16880 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
16890 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
168a0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
168b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
168c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
168d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
168e0 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
168f0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
16900 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
16910 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65   }.  if( n>pPage
16920 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
16930 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
16940 3d 20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = n;.  }.  if( p
16950 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e  nPage ){.    *pn
16960 50 61 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Page = n;.  }.  
16970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16980 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
16990 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
169a0 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
169b0 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
169c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
169d0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
169e0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
169f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
16a00 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
16a10 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
16a20 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
16a30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
16a40 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
16a50 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
16a60 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
16a70 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
16a80 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
16a90 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
16aa0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
16ab0 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
16ac0 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  /*.** Unlink pPg
16ad0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
16ae0 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
16af0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
16b00 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
16b10 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
16b20 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
16b30 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
16b40 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
16b50 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
16b60 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16b70 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
16b80 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
16b90 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
16ba0 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
16bb0 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
16bc0 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
16bd0 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
16be0 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
16bf0 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
16c00 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
16c10 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
16c20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
16c30 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
16c40 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
16c50 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
16c60 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16c70 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
16c80 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
16c90 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
16ca0 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
16cb0 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
16cc0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
16cd0 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
16ce0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
16cf0 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
16d00 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
16d10 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
16d20 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
16d30 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
16d40 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
16d50 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
16d60 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
16d70 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
16d80 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
16d90 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
16da0 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
16db0 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
16dc0 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
16dd0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
16de0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
16df0 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
16e00 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
16e10 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
16e20 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
16e30 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
16e40 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
16e50 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
16e60 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
16e70 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
16e80 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
16e90 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
16ea0 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
16eb0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
16ec0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
16ed0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
16ee0 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65  Unlink from free
16ef0 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
16f00 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
16f10 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  g);..  /* Unlink
16f20 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
16f30 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
16f40 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
16f50 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
16f60 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16f70 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
16f80 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
16f90 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
16fa0 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64  .** is truncated
16fb0 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65  .  Drop from the
16fc0 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73   cache all pages
16fd0 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a   whose pgno is.*
16fe0 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  * larger than pP
16ff0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
17000 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
17010 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
17020 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
17030 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
17040 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
17050 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  **.** Actually, 
17060 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69  at the point thi
17070 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
17080 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65  led, it would be
17090 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
170a0 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  have a reference
170b0 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74  d page.  But rat
170c0 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a  her than delete.
170d0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64  ** that page and
170e0 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62   guarantee a sub
170f0 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74  sequent segfault
17100 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65  , it seems bette
17110 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20  r.** to zero it 
17120 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65  and hope that we
17130 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c   error out sanel
17140 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
17150 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
17160 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
17170 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
17180 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
17190 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
171a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
171b0 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
171c0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
171d0 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
171e0 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
171f0 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
17200 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
17210 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
17220 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
17230 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
17240 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
17250 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17260 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
17270 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
17280 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
17290 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
172a0 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
172b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
172c0 20 20 20 69 66 28 20 2a 70 70 50 67 20 29 7b 0a     if( *ppPg ){.
172d0 20 20 20 20 20 20 20 20 28 2a 70 70 50 67 29 2d          (*ppPg)-
172e0 3e 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 2d  >pPrevAll = pPg-
172f0 3e 70 50 72 65 76 41 6c 6c 3b 0a 20 20 20 20 20  >pPrevAll;.     
17300 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45   }.      IOTRACE
17310 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
17320 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
17330 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
17340 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
17350 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
17360 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c  ount);.      unl
17370 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
17380 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
17390 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
173a0 33 50 61 67 65 46 72 65 65 28 70 50 67 2d 3e 70  3PageFree(pPg->p
173b0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
173c0 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
173d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
173e0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
173f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
17400 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
17410 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
17420 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
17430 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
17440 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
17450 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
17460 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
17470 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
17480 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
17490 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
174a0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
174b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
174c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
174d0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
174e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
174f0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
17500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17510 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
17520 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
17530 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
17540 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
17550 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
17560 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
17570 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
17580 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
17590 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
175a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
175b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
175c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
175d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
175e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
175f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
17600 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
17610 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
17620 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
17630 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
17640 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
17650 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
17660 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17670 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
17680 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
17690 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20  0 || MEMDB );.. 
176a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
176b0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
176c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
176d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
176e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 75   if( pPager->pBu
176f0 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61 67  syHandler ) pPag
17700 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
17710 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->nBusy = 0;.   
17720 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
17730 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
17740 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
17750 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
17760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
17770 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
17780 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
17790 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
177a0 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
177b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
177c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
177d0 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
177e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
177f0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
17800 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
17810 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
17820 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17830 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
17840 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
17850 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
17860 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
17870 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
17880 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
17890 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
178a0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
178b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
178c0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
178d0 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69   MEMDB );.  sqli
178e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
178f0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
17900 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
17910 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
17920 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
17930 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17940 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17950 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
17960 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
17970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17980 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  K;.  }.  if( MEM
17990 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
179a0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
179b0 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
179c0 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
179d0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
179e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
179f0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
17a00 72 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a  r);.  rc = syncJ
17a10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
17a20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
17a30 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
17a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17a60 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
17a70 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
17a80 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
17a90 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
17aa0 2f 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  /.  pagerEnter(p
17ab0 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
17ac0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
17ad0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
17ae0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67  IVE_LOCK);.  pag
17af0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
17b00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17b20 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63  rn rc;.  }..  rc
17b30 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
17b40 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  e(pPager, nPage)
17b50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17b60 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
17b70 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
17b80 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
17b90 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
17ba0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
17bb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
17bc0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
17bd0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
17be0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
17bf0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
17c00 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
17c10 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
17c20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
17c30 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
17c40 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
17c50 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
17c60 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
17c70 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
17c80 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
17c90 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
17ca0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
17cb0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
17cc0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
17cd0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
17ce0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
17cf0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
17d00 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
17d10 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
17d20 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
17d30 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
17d40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
17d50 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
17d60 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
17d70 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
17d80 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
17d90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
17da0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
17db0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
17dc0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
17dd0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
17de0 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  er){.#ifdef SQLI
17df0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
17e00 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
17e10 28 20 21 4d 45 4d 44 42 20 29 7b 0a 23 69 66 6e  ( !MEMDB ){.#ifn
17e20 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
17e30 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65  _NOOP.    sqlite
17e40 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
17e50 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
17e60 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
17e70 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
17e80 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
17e90 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
17ea0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
17eb0 67 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ger->pPrev ){.  
17ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
17ed0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  v->pNext = pPage
17ee0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
17ef0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
17f00 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
17f10 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ager->pNext;.   
17f20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
17f30 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
17f40 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d    pPager->pNext-
17f50 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d  >pPrev = pPager-
17f60 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
17f70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17f80 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
17f90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  }.#endif..  disa
17fa0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
17fb0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
17fc0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
17fd0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65  alloc();.  pPage
17fe0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
17ff0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
18000 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
18010 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
18020 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  r);.  pagerUnloc
18030 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
18040 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  ger);.  enable_s
18050 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
18060 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rs();.  sqlite3E
18070 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
18080 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
18090 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
180a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
180b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
180c0 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
180d0 29 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ).  if( pPager->
180e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
180f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18100 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
18110 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74    }.  sqlite3Bit
18120 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
18130 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
18140 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18150 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
18160 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
18170 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
18180 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18190 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
181a0 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
181b0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
181c0 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
181d0 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
181e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
181f0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
18200 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
18210 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
18220 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  .  */..  sqlite3
18230 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
18240 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ash);.  sqlite3P
18250 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
18260 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
18270 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
18280 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
18290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
182a0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
182b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
182c0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
182d0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
182e0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
182f0 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
18300 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
18310 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
18320 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
18330 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
18340 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
18350 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
18360 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
18370 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
18380 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
18390 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
183a0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
183b0 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
183c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
183d0 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
183e0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
183f0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
18400 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
18410 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
18420 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
18430 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
18440 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
18450 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
18460 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
18470 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
18480 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
18490 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
184a0 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
184b0 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
184c0 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
184d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
184e0 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
184f0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
18500 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18510 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
18520 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
18530 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
18540 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72  ve it. */.    lr
18550 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29  uListRemove(pPg)
18560 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
18570 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
18580 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a   pPg->nRef++;.}.
18590 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
185a0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
185b0 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
185c0 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
185d0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
185e0 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
185f0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
18600 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
18610 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
18620 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
18630 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
18640 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
18650 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
18660 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
18670 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
18680 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
18690 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
186a0 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
186b0 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
186c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
186d0 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
186e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
186f0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
18700 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70  agerEnter(pPg->p
18710 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72  Pager);.  page_r
18720 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72  ef(pPg);.  pager
18730 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65  Leave(pPg->pPage
18740 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
18750 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18760 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
18770 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
18780 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
18790 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
187a0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
187b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
187c0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
187d0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
187e0 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
187f0 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
18800 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
18810 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
18820 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
18830 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
18840 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
18850 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
18860 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
18870 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
18880 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
18890 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
188a0 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
188b0 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
188c0 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
188d0 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
188e0 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
188f0 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
18900 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
18910 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
18920 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
18930 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
18940 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
18950 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
18960 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
18970 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
18980 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
18990 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
189a0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
189b0 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
189c0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
189d0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
189e0 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
189f0 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
18a00 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
18a10 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
18a20 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
18a30 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
18a40 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
18a50 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
18a60 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
18a70 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
18a80 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
18a90 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
18aa0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
18ab0 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
18ac0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
18ad0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
18ae0 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63  , so no sync occ
18af0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  urs..**.** If th
18b00 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
18b10 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  AL flag is set f
18b20 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  or the persisten
18b30 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68  t media on which
18b40 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18b50 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e   is stored, then
18b60 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76   OsSync() is nev
18b70 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  er called on the
18b80 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
18b90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
18ba0 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
18bb0 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65  red is to update
18bc0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
18bd0 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  in.** the journa
18be0 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  l header..**.** 
18bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
18c00 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
18c10 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
18c20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
18c30 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
18c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
18c50 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
18c60 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
18c70 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
18c80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
18c90 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
18ca0 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
18cb0 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
18cc0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
18cd0 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
18ce0 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
18cf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
18d00 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
18d10 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
18d20 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
18d30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18d40 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
18d50 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
18d60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
18d70 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
18d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18da0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
18db0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
18dc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
18de0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
18df0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
18e00 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
18e10 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
18e20 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
18e30 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
18e40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
18e50 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
18e60 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
18e70 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
18e80 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
18e90 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
18ea0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
18eb0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
18ec0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
18ed0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
18ee0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
18ef0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
18f00 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
18f10 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
18f20 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
18f30 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
18f40 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
18f50 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
18f60 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
18f70 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
18f80 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
18f90 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
18fa0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
18fb0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
18fc0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
18fd0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
18fe0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
18ff0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
19000 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
19010 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
19020 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
19030 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19040 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
19050 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
19060 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
19070 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
19080 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
19090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
190a0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
190b0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
190c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
190d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
190e0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
190f0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
19100 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19110 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
19120 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
19130 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
19140 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
19150 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19170 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
19180 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
19190 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
191a0 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  gic);.        IO
191b0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
191c0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
191d0 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29  er, jrnlOff, 4))
191e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
191f0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
19200 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
19210 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
19220 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
19230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19240 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
19250 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
19260 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
19270 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
19280 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
19290 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
192a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
192b0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
192c0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
192d0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
192e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
192f0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
19300 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
19310 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
19320 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
19330 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
19340 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
19350 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
19360 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
19370 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
19380 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19390 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
193a0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
193b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
193c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
193d0 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
193e0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
193f0 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
19400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
19410 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
19420 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
19430 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
19440 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
19450 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
19460 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
19470 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
19480 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
19490 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
194a0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
194b0 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
194c0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
194d0 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
194e0 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
194f0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
19500 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
19510 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
19520 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
19530 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
19540 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
19550 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
19560 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
19570 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
19580 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
19590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
195a0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
195b0 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c  ynced==pPager->l
195c0 72 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  ru.pFirst );.  }
195d0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
195e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
195f0 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f  erge two lists o
19600 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  f pages connecte
19610 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20  d by pDirty and 
19620 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a  in pgno order..*
19630 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69  * Do not both fi
19640 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69  xing the pPrevDi
19650 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  rty pointers..*/
19660 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d  .static PgHdr *m
19670 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67  erge_pagelist(Pg
19680 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a  Hdr *pA, PgHdr *
19690 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73  pB){.  PgHdr res
196a0 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70  ult, *pTail;.  p
196b0 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a  Tail = &result;.
196c0 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
196d0 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
196e0 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29  >pgno<pB->pgno )
196f0 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
19700 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20  Dirty = pA;.    
19710 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20    pTail = pA;.  
19720 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69      pA = pA->pDi
19730 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
19740 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
19750 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rty = pB;.      
19760 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20  pTail = pB;.    
19770 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74    pB = pB->pDirt
19780 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  y;.    }.  }.  i
19790 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61  f( pA ){.    pTa
197a0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
197b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20  .  }else if( pB 
197c0 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
197d0 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c  irty = pB;.  }el
197e0 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70  se{.    pTail->p
197f0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Dirty = 0;.  }. 
19800 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70   return result.p
19810 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
19820 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66  Sort the list of
19830 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
19840 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e  ing order by pgn
19850 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a  o.  Pages are.**
19860 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
19870 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20  irty pointers.  
19880 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  The pPrevDirty p
19890 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63  ointers are.** c
198a0 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73  orrupted by this
198b0 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   sort..*/.#defin
198c0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  e N_SORT_BUCKET_
198d0 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65  ALLOC 25.#define
198e0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20   N_SORT_BUCKET  
198f0 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53       25.#ifdef S
19900 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
19910 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
19920 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30  _sort_bucket = 0
19930 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52  ;.  #undef N_SOR
19940 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69  T_BUCKET.  #defi
19950 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
19960 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70   \.   (sqlite3_p
19970 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
19980 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72  et?sqlite3_pager
19990 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e  _n_sort_bucket:N
199a0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
199b0 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  OC).#endif.stati
199c0 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
199d0 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
199e0 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
199f0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19a00 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69  OC], *p;.  int i
19a10 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c  ;.  memset(a, 0,
19a20 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77   sizeof(a));.  w
19a30 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20  hile( pIn ){.   
19a40 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49   p = pIn;.    pI
19a50 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  n = p->pDirty;. 
19a60 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
19a70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19a80 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  <N_SORT_BUCKET-1
19a90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19aa0 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( a[i]==0 ){.   
19ab0 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20       a[i] = p;. 
19ac0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ae0 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19af0 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
19b00 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30          a[i] = 0
19b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19b20 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52      if( i==N_SOR
19b30 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20  T_BUCKET-1 ){.  
19b40 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
19b50 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68   To get here, th
19b60 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32  ere need to be 2
19b70 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29  ^(N_SORT_BUCKET)
19b80 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65   .      ** eleme
19b90 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
19ba0 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70   list. This is p
19bb0 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70  ossible, but imp
19bc0 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20  ractical..      
19bd0 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20  ** Testing this 
19be0 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e  line is the poin
19bf0 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69  t of global vari
19c00 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71  able.      ** sq
19c10 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19c20 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20  rt_bucket..     
19c30 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   */.      a[i] =
19c40 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
19c50 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
19c60 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
19c70 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
19c80 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
19c90 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
19ca0 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
19cb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19cc0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
19cd0 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
19ce0 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
19cf0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
19d00 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
19d10 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
19d20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
19d30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19d40 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
19d50 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
19d60 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
19d70 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
19d80 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
19d90 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
19da0 50 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a  Pager;.  PgHdr *
19db0 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  p;.  int rc;..  
19dc0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19de0 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
19df0 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
19e00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
19e10 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
19e20 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
19e30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
19e40 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
19e50 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
19e60 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
19e70 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
19e80 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
19e90 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
19ea0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
19eb0 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
19ec0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
19ed0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
19ee0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
19ef0 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
19f00 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
19f10 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
19f20 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
19f30 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
19f40 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
19f50 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
19f60 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
19f70 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
19f80 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
19f90 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
19fa0 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
19fb0 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
19fc0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
19fd0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
19fe0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
19ff0 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
1a000 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
1a010 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
1a020 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
1a030 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1a040 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
1a050 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
1a060 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
1a070 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
1a080 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
1a090 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1a0a0 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
1a0b0 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
1a0c0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1a0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a0e0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
1a0f0 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
1a100 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
1a110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a120 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
1a130 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
1a140 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
1a150 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1a160 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
1a170 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1a180 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1a190 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1a1a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a1b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1a1c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
1a1d0 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65  List = sort_page
1a1e0 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66  list(pList);.  f
1a1f0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1a200 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1a210 20 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74   assert( p->dirt
1a220 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74  y );.    p->dirt
1a230 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  y = 0;.  }.  whi
1a240 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
1a250 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1a260 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1a270 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1a280 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
1a290 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1a2a0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1a2b0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1a2c0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
1a2d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a2e0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1a2f0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
1a300 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
1a310 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1a320 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a330 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1a340 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1a350 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1a360 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1a370 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1a380 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a390 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1a3a0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1a3b0 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
1a3c0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
1a3d0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
1a3e0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
1a3f0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
1a400 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
1a410 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
1a420 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
1a430 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1a440 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
1a450 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
1a460 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ze ){.      i64 
1a470 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d  offset = (pList-
1a480 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
1a490 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1a4a0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1a4b0 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
1a4c0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
1a4d0 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
1a4e0 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
1a4f0 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f  PAGERTRACE4("STO
1a500 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
1a510 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1a540 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61   pList->pgno, pa
1a550 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1a560 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  st));.      IOTR
1a570 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
1a580 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
1a590 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
1a5a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a5b0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1a5c0 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
1a5d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1a5e0 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  et);.      PAGER
1a5f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1a600 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1a610 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1a620 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
1a630 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ite);.      if( 
1a640 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1a650 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1a660 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1a670 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
1a680 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1a690 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1a6a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
1a6b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1a6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1a6d0 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45  RTRACE3("NOSTORE
1a6e0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1a6f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1a700 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1a710 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a720 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a730 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
1a740 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1a750 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1a760 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1a770 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1a780 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1a790 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1a7a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a7b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
1a7c0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
1a7d0 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
1a7e0 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
1a7f0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1a800 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
1a810 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
1a820 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
1a830 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
1a840 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
1a850 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1a860 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
1a870 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1a880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a890 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a8a0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65  .  /* Verify the
1a8b0 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64   sanity of the d
1a8c0 69 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77  irty list when w
1a8d0 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20  e are running.  
1a8e0 2a 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20  ** in debugging 
1a8f0 6d 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20 65  mode.  This is e
1a900 78 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20  xpensive, so do 
1a910 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73  not.  ** do this
1a920 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   on a normal bui
1a930 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20  ld. */.  int n1 
1a940 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20  = 0;.  int n2 = 
1a950 30 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  0;.  PgHdr *p;. 
1a960 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1a970 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
1a980 78 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64  xtAll){ if( p->d
1a990 69 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20  irty ) n1++; }. 
1a9a0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1a9b0 44 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70  Dirty; p; p=p->p
1a9c0 44 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a  Dirty){ n2++; }.
1a9d0 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32    assert( n1==n2
1a9e0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65   );.#endif..  re
1a9f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
1aa00 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
1aa10 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
1aa20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
1aa30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1aa40 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f  ger..** A hot jo
1aa50 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
1aa60 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  t needs to be pl
1aa70 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  ayed back..**.**
1aa80 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1aa90 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1aaa0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
1aab0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
1aac0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
1aad0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
1aae0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
1aaf0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
1ab00 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
1ab10 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
1ab20 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65  me.  Just delete
1ab30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1ab40 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
1ab50 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  ive if unable to
1ab60 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1ab70 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75  tatus of the jou
1ab80 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
1ab90 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
1aba0 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  t open the journ
1abb0 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  al file to exami
1abc0 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  ne its.** conten
1abd0 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a  t.  Hence, the j
1abe0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
1abf0 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
1ac00 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75   a master.** jou
1ac10 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68  rnal file that h
1ac20 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
1ac30 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62   and hence not b
1ac40 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68  e hot.  Or.** th
1ac50 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
1ac60 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65  journal might be
1ac70 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68   zeroed out.  Th
1ac80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
1ac90 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20  es not discover 
1aca0 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61  these cases of a
1acb0 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c   non-hot journal
1acc0 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75   - if the.** jou
1acd0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
1ace0 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74   and is not empt
1acf0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  y this routine a
1ad00 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20  ssumes it.** is 
1ad10 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f  hot.  The pager_
1ad20 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
1ad30 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
1ad40 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75   that the.** jou
1ad50 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1ad60 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
1ad70 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  will no-op..*/.s
1ad80 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
1ad90 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1ada0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1adb0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1adc0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
1add0 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  t res = 0;.  if(
1ade0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1adf0 6e 61 6c 20 26 26 20 70 50 61 67 65 72 2d 3e 66  nal && pPager->f
1ae00 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1ae10 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
1ae20 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 69  nt exists;.    i
1ae30 6e 74 20 6c 6f 63 6b 65 64 3b 0a 0a 20 20 20 20  nt locked;..    
1ae40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1ae50 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
1ae60 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
1ae70 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1ae80 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
1ae90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aea0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
1aeb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1aec0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
1aed0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
1aee0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
1aef0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
1af00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
1af10 74 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  ts && !locked ){
1af20 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
1af30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1af40 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1af50 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
1af60 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1af70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1af80 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1af90 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1afa0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
1afb0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
1afc0 20 20 20 20 20 20 20 65 78 69 73 74 73 20 3d 20         exists = 
1afd0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1afe0 0a 0a 20 20 20 20 72 65 73 20 3d 20 28 72 63 21  ..    res = (rc!
1aff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 2d 31 20  =SQLITE_OK ? -1 
1b000 3a 20 28 65 78 69 73 74 73 20 26 26 20 21 6c 6f  : (exists && !lo
1b010 63 6b 65 64 29 29 3b 0a 20 20 7d 0a 0a 20 20 72  cked));.  }..  r
1b020 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1b030 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
1b040 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
1b050 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
1b060 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
1b070 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1b080 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1b090 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
1b0a0 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
1b0b0 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
1b0c0 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
1b0d0 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
1b0e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b0f0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
1b100 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1b110 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
1b120 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
1b130 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74  Pg = 0;..  /* It
1b140 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
1b150 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1b160 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67  n unless the pag
1b170 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70  er object.  ** p
1b180 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61  ointed to by pPa
1b190 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74  ger has at least
1b1a0 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28   one free page (
1b1b0 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d  page with nRef==
1b1c0 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  0)..  */ .  asse
1b1d0 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73  rt(!MEMDB);.  as
1b1e0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
1b1f0 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20  .pFirst);..  /* 
1b200 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
1b210 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
1b220 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
1b230 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1b240 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
1b250 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
1b260 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
1b270 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
1b280 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1b290 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
1b2a0 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
1b2b0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
1b2c0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
1b2d0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
1b2e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b2f0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
1b300 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
1b310 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
1b320 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
1b330 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
1b340 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
1b350 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
1b360 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
1b370 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
1b380 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
1b390 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
1b3a0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1b3b0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1b3c0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
1b3d0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1b3e0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1b3f0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1b400 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
1b410 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1b420 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1b430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b440 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b450 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1b460 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1b470 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b480 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
1b490 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20         /* If in 
1b4a0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
1b4b0 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
1b4c0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
1b4d0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
1b4e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
1b4f0 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
1b500 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
1b510 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
1b520 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
1b530 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
1b540 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
1b550 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
1b560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 72  e.        ** alr
1b570 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1b580 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1b590 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
1b5a0 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 20  eader is.       
1b5b0 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
1b5c0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1b5d0 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
1b5e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b5f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1b600 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b610 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b620 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
1b630 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b640 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1b650 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1b660 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1b670 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b680 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1b690 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b6a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b6b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b6c0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1b6d0 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20  u.pFirst;.  }.. 
1b6e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1b6f0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
1b700 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
1b710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b720 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
1b730 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1b740 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
1b750 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1b760 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b770 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
1b780 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1b790 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1b7a0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b7b0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1b7c0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1b7d0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1b7e0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
1b7f0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b800 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  0;.    if( rc!=S
1b810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b830 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1b840 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 7c   pPg->dirty==0 |
1b850 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
1b860 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
1b870 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
1b880 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
1b890 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1b8a0 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
1b8b0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
1b8c0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1b8d0 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
1b8e0 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
1b8f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1b900 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
1b910 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
1b920 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1b930 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
1b940 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
1b950 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
1b960 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
1b970 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
1b980 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
1b990 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
1b9a0 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
1b9b0 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
1b9c0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
1b9d0 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
1b9e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
1b9f0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1ba00 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
1ba10 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
1ba20 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1ba30 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
1ba40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1ba50 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1ba60 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1ba70 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
1ba80 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
1ba90 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
1baa0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1bab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
1bac0 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
1bad0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
1bae0 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
1baf0 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
1bb00 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
1bb10 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1bb20 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
1bb30 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1bb40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1bb50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1bb60 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1bb70 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EMENT./*.** This
1bb80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bb90 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
1bba0 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
1bbb0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
1bbc0 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
1bbd0 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
1bbe0 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
1bbf0 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
1bc00 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
1bc10 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1bc20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
1bc30 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a  lite3_free()ed..
1bc40 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
1bc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bc60 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
1bc70 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
1bc80 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
1bc90 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
1bca0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
1bcb0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1bcc0 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
1bcd0 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
1bce0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1bcf0 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eased..*/.int sq
1bd00 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
1bd10 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
1bd20 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  ){.  int nReleas
1bd30 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1bd40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
1bd50 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20  ory released so 
1bd60 66 61 72 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  far */.  Pager *
1bd70 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
1bd80 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1bd90 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20  ing over pagers 
1bda0 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
1bdb0 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20   *savedBusy;    
1bdc0 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f   /* Saved copy o
1bdd0 66 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  f the busy handl
1bde0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1bdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1be00 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65  * Acquire the me
1be10 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1be20 6d 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64  mutex.  */.#ifnd
1be30 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
1be40 4e 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NOOP.  sqlite3_m
1be50 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1be60 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d     /* The MEM2 m
1be70 75 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20  utex */.  mutex 
1be80 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1be90 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1bea0 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23  _STATIC_MEM2);.#
1beb0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1bec0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
1bed0 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c  x);..  /* Signal
1bee0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
1bef0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  nnections that m
1bf00 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1bf10 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68   wants.  ** to h
1bf20 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ave access to th
1bf30 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  e pagers..  */. 
1bf40 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69   for(pPager=sqli
1bf50 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50  te3PagerList; pP
1bf60 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61  ager; pPager=pPa
1bf70 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
1bf80 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
1bf90 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77  MM = 1;.  }..  w
1bfa0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1bfb0 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c  _OK && (nReq<0 |
1bfc0 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71  | nReleased<nReq
1bfd0 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  ) ){.    PgHdr *
1bfe0 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a  pPg;.    PgHdr *
1bff0 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20  pRecycled;. .   
1c000 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1c010 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
1c020 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1c030 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29  require a sync()
1c040 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  . If.    ** this
1c050 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1c060 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20  , find one that 
1c070 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73  does require a s
1c080 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ync()..    */.  
1c090 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c0a0 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
1c0b0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1c0c0 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
1c0d0 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  );.    pPg = sql
1c0e0 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
1c0f0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20 20  pFirstSynced;.  
1c100 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20    while( pPg && 
1c110 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c  (pPg->needSync |
1c120 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  | pPg->pPager->i
1c130 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20 20  InUseDB) ){.    
1c140 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72    pPg = pPg->gfr
1c150 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  ee.pNext;.    }.
1c160 20 20 20 20 69 66 28 20 21 70 50 67 20 29 7b 0a      if( !pPg ){.
1c170 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
1c180 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
1c190 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69  First;.      whi
1c1a0 6c 65 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  le( pPg && pPg->
1c1b0 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
1c1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20   ){.        pPg 
1c1d0 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65  = pPg->gfree.pNe
1c1e0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1c1f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  }.    sqlite3_mu
1c200 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1c210 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1c220 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c230 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  LRU));..    /* I
1c240 66 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74  f pPg==0, then t
1c250 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68  he block above h
1c260 61 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  as failed to fin
1c270 64 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20  d a page to.    
1c280 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74  ** recycle. In t
1c290 68 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20  his case return 
1c2a0 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68  early - no furth
1c2b0 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20  er memory will. 
1c2c0 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65     ** be release
1c2d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1c2e0 28 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a  ( !pPg ) break;.
1c2f0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
1c300 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61  g->pPager;.    a
1c310 73 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64  ssert(!pPg->need
1c320 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61  Sync || pPg==pPa
1c330 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29  ger->lru.pFirst)
1c340 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67  ;.    assert(pPg
1c350 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1c360 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1c370 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20  FirstSynced);.  
1c380 0a 20 20 20 20 73 61 76 65 64 42 75 73 79 20 3d  .    savedBusy =
1c390 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
1c3a0 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65  ndler;.    pPage
1c3b0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
1c3c0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1c3d0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
1c3e0 65 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b  er, &pRecycled);
1c3f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75  .    pPager->pBu
1c400 73 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65  syHandler = save
1c410 64 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72  dBusy;.    asser
1c420 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67  t(pRecycled==pPg
1c430 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1c440 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
1c450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c460 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
1c470 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
1c480 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1c490 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
1c4a0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  n .      ** remo
1c4b0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
1c4c0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
1c4d0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
1c4e0 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a  ed-list .      *
1c4f0 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
1c500 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
1c510 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
1c520 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
1c530 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
1c540 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
1c550 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
1c560 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1c570 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
1c580 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
1c590 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
1c5a0 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
1c5b0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
1c5c0 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
1c5d0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72    */.      PgHdr
1c5e0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73   *pTmp;.      as
1c5f0 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
1c600 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
1c610 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1c620 20 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d       assert(pPg-
1c630 3e 70 50 72 65 76 41 6c 6c 3d 3d 30 29 3b 0a 20  >pPrevAll==0);. 
1c640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1c650 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3d 3d 30 20  Pg->pNextAll==0 
1c660 7c 7c 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  || pPg->pNextAll
1c670 2d 3e 70 50 72 65 76 41 6c 6c 3d 3d 70 50 67 29  ->pPrevAll==pPg)
1c680 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
1c690 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
1c6a0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
1c6b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1c6c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
1c6d0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 2d 3e 70   pPager->pAll->p
1c6e0 50 72 65 76 41 6c 6c 20 3d 20 30 3b 0a 20 20 20  PrevAll = 0;.   
1c6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1c700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 61 73  lse{.         as
1c710 73 65 72 74 28 70 50 67 2d 3e 70 50 72 65 76 41  sert(pPg->pPrevA
1c720 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73  ll);.         as
1c730 73 65 72 74 28 70 50 67 2d 3e 70 50 72 65 76 41  sert(pPg->pPrevA
1c740 6c 6c 2d 3e 70 4e 65 78 74 41 6c 6c 3d 3d 70 50  ll->pNextAll==pP
1c750 67 29 3b 0a 20 20 20 20 20 20 20 20 20 70 54 6d  g);.         pTm
1c760 70 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 41 6c  p = pPg->pPrevAl
1c770 6c 3b 0a 20 20 20 20 20 20 20 20 20 70 54 6d 70  l;.         pTmp
1c780 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67  ->pNextAll = pPg
1c790 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1c7a0 20 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70       if( pTmp->p
1c7b0 4e 65 78 74 41 6c 6c 20 29 7b 0a 20 20 20 20 20  NextAll ){.     
1c7c0 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
1c7d0 74 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d  tAll->pPrevAll =
1c7e0 20 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 20   pTmp;.         
1c7f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1c800 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20  nReleased += (. 
1c810 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1c820 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
1c830 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
1c840 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
1c850 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1c860 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45  a.          + ME
1c870 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1c880 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a  tory) .      );.
1c890 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c8a0 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e  PGFREE %p %d *\n
1c8b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1c8c0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
1c8d0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c8e0 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
1c8f0 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  unt);.      sqli
1c900 74 65 33 50 61 67 65 46 72 65 65 28 70 50 67 2d  te3PageFree(pPg-
1c910 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  >pData);.      s
1c920 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
1c930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c940 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c  nPage--;.    }el
1c950 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1c960 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
1c970 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
1c980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c990 65 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a  e or .      ** j
1c9a0 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f  ournal in pager_
1c9b0 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65  recycle(). The e
1c9c0 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
1c9d0 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  rned to the .   
1c9e0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20     ** caller of 
1c9f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
1ca00 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20  nstead, set the 
1ca10 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
1ca20 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  riable..      **
1ca30 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
1ca40 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
1ca50 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72  he user (or user
1ca60 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a  s, in the case .
1ca70 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
1ca80 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
1ca90 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
1caa0 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
1cab0 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
1cac0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
1cad0 74 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63  t(.          (rc
1cae0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
1caf0 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20  OERR ||.        
1cb00 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c    rc==SQLITE_FUL
1cb10 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72  L ||.          r
1cb20 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20  c==SQLITE_BUSY. 
1cb30 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
1cb40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1cb50 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1cb60 56 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67  VED );.      pag
1cb70 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1cb80 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   rc);.    }.  }.
1cb90 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
1cba0 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  memory managemen
1cbb0 74 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65  t flags and rele
1cbc0 61 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20  ase the mutex.  
1cbd0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d  */.  for(pPager=
1cbe0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
1cbf0 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72  ; pPager; pPager
1cc00 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b  =pPager->pNext){
1cc10 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49  .     pPager->iI
1cc20 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a  nUseMM = 0;.  }.
1cc30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cc40 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20  leave(mutex);.. 
1cc50 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   /* Return the n
1cc60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1cc70 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72  eleased.  */.  r
1cc80 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b  eturn nReleased;
1cc90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1cca0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
1ccb0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a  Y_MANAGEMENT */.
1ccc0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1ccd0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1cce0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1ccf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1cd00 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cd10 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  DbPage(Pager *pP
1cd20 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
1cd30 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1cd40 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66  int rc;.  i64 of
1cd50 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
1cd60 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73  MEMDB==0 );.  as
1cd70 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
1cd80 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
1cd90 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
1cda0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
1cdb0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1cdc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1cdd0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
1cde0 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
1cdf0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1ce00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1ce10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ce20 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1ce30 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1ce40 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1ce50 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
1ce60 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1ce70 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1ce80 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1ce90 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1cea0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1ceb0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1cec0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1ced0 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
1cee0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  ){.    memcpy(&p
1cef0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1cf00 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f  s, &((u8*)PGHDR_
1cf10 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34  TO_DATA(pPg))[24
1cf20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1cf60 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1cf70 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1cf80 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
1cf90 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
1cfa0 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41  , 3);.  PAGERTRA
1cfb0 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61  CE4("FETCH %d pa
1cfc0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1cfd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cfe0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1cff0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1d000 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1d010 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Pg));.  return r
1d020 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1d030 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d040 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
1d050 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
1d060 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
1d070 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
1d080 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
1d090 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
1d0a0 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
1d0b0 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
1d0c0 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
1d0d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1d0e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69  op..**.** Immedi
1d0f0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
1d100 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  ining the shared
1d110 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72   lock (if requir
1d120 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ed), this functi
1d130 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72  on.** checks for
1d140 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
1d150 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ile. If one is f
1d160 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e  ound, an emergen
1d170 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  cy rollback.** i
1d180 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65  s performed imme
1d190 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  diately..*/.stat
1d1a0 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
1d1b0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
1d1c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1d1d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d1e0 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20  nt isHot = 0;.. 
1d1f0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
1d200 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
1d210 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
1d220 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
1d230 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
1d240 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
1d250 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
1d260 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
1d270 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
1d280 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
1d290 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
1d2a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1d2b0 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
1d2c0 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
1d2d0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
1d2e0 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
1d2f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
1d300 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
1d310 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
1d320 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1d330 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1d340 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  de ){.    if( pP
1d350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d360 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74  n ){.      isHot
1d370 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1d380 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d390 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d3a0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1d3b0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
1d3c0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1d3d0 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f  still in an erro
1d3e0 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
1d3f0 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72  proceed. The err
1d400 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77  or .  ** state w
1d410 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61  ill be cleared a
1d420 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1d430 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20  the future when 
1d440 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72  all page .  ** r
1d450 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72  eferences are dr
1d460 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61  opped and the ca
1d470 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
1d480 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rded..  */.  if(
1d490 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d4a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1d4b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1d4c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1d4d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1d4e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1d4f0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d500 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20  UNLOCK || isHot 
1d510 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1d520 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1d530 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28  r->pVfs;.    if(
1d540 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1d550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d560 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
1d570 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1d580 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
1d590 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d5a0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1d5b0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
1d5c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d5d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d5e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d5f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1d600 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1d610 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d620 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1d630 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1d640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1d650 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d660 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1d670 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
1d680 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
1d690 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
1d6a0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1d6b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1d6c0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
1d6d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1d6e0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
1d6f0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
1d700 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
1d710 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d720 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
1d730 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1d740 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
1d750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d760 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1d770 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1d780 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
1d790 20 20 69 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69    if( rc==1 || i
1d7a0 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sHot ){.        
1d7b0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
1d7c0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1d7d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
1d7e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
1d7f0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
1d800 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
1d810 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1d820 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
1d830 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
1d840 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
1d850 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
1d860 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
1d870 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
1d880 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d890 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
1d8a0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
1d8b0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
1d8c0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
1d8d0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1d8e0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
1d8f0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
1d900 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
1d910 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
1d920 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
1d930 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1d940 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
1d950 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
1d960 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
1d970 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
1d980 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
1d990 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
1d9a0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
1d9b0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
1d9c0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
1d9d0 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   ** obtain its o
1d9e0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
1d9f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1da00 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  e file..        
1da10 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1da20 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
1da30 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
1da40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1da50 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1da60 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
1da70 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
1da80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1da90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1daa0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1dab0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1dac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1dad0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
1dae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1daf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1db00 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1db10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20  ;.        }. .  
1db20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
1db30 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
1db40 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
1db50 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1db60 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   in .        ** 
1db70 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1db80 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
1db90 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
1dba0 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a  e kept open and.
1dbb0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
1dbc0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
1dbd0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
1dbe0 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
1dbf0 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
1dc00 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
1dc10 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
1dc20 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1dc30 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
1dc40 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  es.        ** a 
1dc50 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
1dc60 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20  handle..        
1dc70 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
1dc80 69 73 48 6f 74 20 26 26 20 70 50 61 67 65 72 2d  isHot && pPager-
1dc90 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1dca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1dcb0 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20   res;.          
1dcc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1dcd0 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
1dce0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
1dcf0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1dd00 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 20  &res);.         
1dd10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dd20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dd30 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
1dd40 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1dd50 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
1dd60 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
1dd70 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1dd80 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
1dd90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1ddb0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ddc0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
1ddd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1dde0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1ddf0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1de00 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1de10 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
1de20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1de30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1de40 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1de50 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
1de60 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 75           if( fou
1de70 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
1de80 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
1de90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1dea0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1dec0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1ded0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
1dee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1def0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1df00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1df10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
1df20 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74   not exist, that
1df30 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65   means some othe
1df40 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
1df50 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
1df60 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74  lready rolled it
1df70 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   back */.       
1df80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1df90 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1dfa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dfb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1dfc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dfd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dfe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dff0 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d  TE_NOMEM && rc!=
1e000 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
1e010 4f 43 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20  OCK .           
1e020 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1e030 45 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20  ERR_NOMEM .     
1e040 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e050 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e060 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1e070 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
1e080 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
1e090 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1e0a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1e0b0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   1;.        pPag
1e0c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1e0d0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1e0e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e0f0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
1e100 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1e110 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
1e120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1e130 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20  r = 0;. .       
1e140 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
1e150 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1e160 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
1e170 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
1e180 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
1e190 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
1e1a0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
1e1b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
1e1c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1e1d0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
1e1e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e1f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e200 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1e210 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1e220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1e230 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1e240 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1e250 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
1e260 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
1e270 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
1e280 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1e290 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1e2a0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
1e2b0 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
1e2c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1e2d0 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
1e2e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e2f0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
1e300 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
1e310 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
1e320 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
1e330 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
1e340 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
1e350 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
1e360 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
1e370 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f         ** read o
1e380 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1e390 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
1e3a0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
1e3b0 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  ase.        ** h
1e3c0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1e3d0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1e3e0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
1e3f0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
1e400 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
1e410 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1e420 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
1e430 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
1e440 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
1e450 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
1e460 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66          ** at of
1e470 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
1e480 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
1e490 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
1e4a0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
1e4b0 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
1e4c0 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
1e4d0 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
1e4e0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
1e4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  .        ** othe
1e500 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
1e510 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
1e520 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
1e530 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  en.        ** a 
1e540 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
1e550 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
1e560 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
1e570 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
1e580 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
1e590 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
1e5a0 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a  ot be .        *
1e5b0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
1e5c0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
1e5d0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
1e5e0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
1e5f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63  .        ** it c
1e600 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
1e610 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e620 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
1e630 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
1e640 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
1e650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e660 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1e670 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20  Pager, 0);..    
1e680 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e690 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1e6a0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
1e6b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
1e6c0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1e6d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1e6e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1e6f0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
1e700 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1e710 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
1e720 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
1e730 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
1e740 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e750 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1e760 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
1e770 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
1e780 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
1e790 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e7a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e7b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1e7c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 20  ailed;.         
1e7d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1e7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1e7f0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
1e800 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1e810 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
1e820 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
1e830 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
1e840 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1e850 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1e860 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
1e870 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
1e880 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e8a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e8b0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
1e8c0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
1e8d0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
1e8e0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1e8f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1e900 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1e910 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1e920 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1e930 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
1e940 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
1e950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e960 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
1e970 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1e980 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
1e990 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
1e9a0 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
1e9b0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1e9c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1e9d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e9e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50  .** Allocate a P
1e9f0 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45  gHdr object.   E
1ea00 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e  ither create a n
1ea10 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a  ew one or reuse.
1ea20 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  ** an existing o
1ea30 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  ne that is not o
1ea40 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e  therwise in use.
1ea50 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48  .**.** A new PgH
1ea60 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20  dr structure is 
1ea70 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f  created if any o
1ea80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ea90 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a  are.** true:.**.
1eaa0 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1eab0 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64  ave not exceeded
1eac0 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   our maximum all
1ead0 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a  ocated cache siz
1eae0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73  e.**          as
1eaf0 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41   set by the "PRA
1eb00 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20  GMA cache_size" 
1eb10 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1eb20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72     (2)  There ar
1eb30 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64  e no unused PgHd
1eb40 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61  r objects availa
1eb50 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  ble at this time
1eb60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  ..**.**     (3) 
1eb70 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
1eb80 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1eb90 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54  **.**     (4)  T
1eba0 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64  here are no PgHd
1ebb0 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64  r objects that d
1ebc0 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  o not require a 
1ebd0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
1ebe0 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e      file sync an
1ebf0 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20  d a sync of the 
1ec00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1ec10 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
1ec20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64        prohibited
1ec30 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ec40 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  e, reuse an exis
1ec50 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20  ting PgHdr.  In 
1ec60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75  other words, reu
1ec70 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  se an.** existin
1ec80 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f  g PgHdr if all o
1ec90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1eca0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1ecb0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1ecc0 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65   reached or exce
1ecd0 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  eded the maximum
1ece0 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
1ecf0 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
1ed00 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  by "PRAGMA cache
1ed10 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  _size"..**.**   
1ed20 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20    (2)  There is 
1ed30 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c  a PgHdr availabl
1ed40 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52  e with PgHdr->nR
1ed50 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ef==0.**.**     
1ed60 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20  (3)  We are not 
1ed70 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  in an in-memory 
1ed80 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
1ed90 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74     (4)  Either t
1eda0 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c  here is an avail
1edb0 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20  able PgHdr that 
1edc0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  does not need.**
1edd0 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20            to be 
1ede0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f  synced to disk o
1edf0 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63  r else disk sync
1ee00 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ing is currently
1ee10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
1ee20 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owed..*/.static 
1ee30 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  int pagerAllocat
1ee40 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  ePage(Pager *pPa
1ee50 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1ee60 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ee70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
1ee80 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42  r *pPg;.  int nB
1ee90 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72  yteHdr;..  /* Cr
1eea0 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72  eate a new PgHdr
1eeb0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
1eec0 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64  our conditions d
1eed0 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f  efined .  ** abo
1eee0 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20  ve are met: */. 
1eef0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
1ef00 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
1ef10 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e.   || pPager->
1ef20 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20  lru.pFirst==0 . 
1ef30 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
1ef40 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46   (pPager->lru.pF
1ef50 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
1ef60 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1ef70 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 76 6f 69  nc).  ){.    voi
1ef80 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 66  d *pData;.    if
1ef90 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
1efa0 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
1efb0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
1efc0 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28  size_hash_table(
1efd0 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
1efe0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32   pPager->nHash<2
1eff0 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65  56 ? 256 : pPage
1f000 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20  r->nHash*2);.   
1f010 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1f020 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Hash==0 ){.     
1f030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f040 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
1f050 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1f060 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
1f070 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65     }.    pagerLe
1f080 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
1f090 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65   nByteHdr = size
1f0a0 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f  of(*pPg) + sizeo
1f0b0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1f0c0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1f0d0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
1f0e0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b  zeof(PgHistory);
1f0f0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
1f100 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48  e3Malloc( nByteH
1f110 64 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dr );.    if( pP
1f120 67 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  g ){.      pData
1f130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
1f140 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
1f150 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1f160 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1f170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f180 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1f190 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
1f1a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1f1b0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1f1c0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30  ;.    if( pPg==0
1f1d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f1e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f1f0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1f200 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1f210 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
1f220 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a  , 0, nByteHdr);.
1f230 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d      pPg->pData =
1f240 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d   pData;.    pPg-
1f250 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1f260 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1f270 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1f280 6c 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ll;.#ifdef SQLIT
1f290 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1f2a0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20 20 69  MANAGEMENT.    i
1f2b0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  f( pPg->pNextAll
1f2c0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1f2d0 4e 65 78 74 41 6c 6c 2d 3e 70 50 72 65 76 41 6c  NextAll->pPrevAl
1f2e0 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 23  l = pPg;.    }.#
1f2f0 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
1f300 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
1f310 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
1f320 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1f330 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
1f340 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
1f350 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
1f360 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
1f370 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
1f380 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
1f390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
1f3a0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
1f3b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
1f3c0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
1f3d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
1f3f0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1f400 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1f410 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f420 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1f430 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1f440 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1f450 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
1f460 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
1f470 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f480 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
1f490 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
1f4a0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
1f4b0 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
1f4c0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
1f4d0 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1f4e0 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
1f4f0 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
1f500 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
1f510 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
1f520 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
1f530 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
1f540 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
1f550 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
1f560 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
1f570 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
1f580 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
1f590 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
1f5a0 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
1f5b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f5c0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1f5d0 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
1f5e0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
1f5f0 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
1f600 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1f610 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
1f620 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1f630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f640 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
1f650 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1f660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1f670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f680 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f690 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f6a0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
1f6b0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
1f6c0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
1f6d0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
1f6e0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
1f6f0 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
1f700 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
1f710 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1f720 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1f730 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1f740 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f750 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1f760 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1f770 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1f780 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1f790 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1f7a0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1f7b0 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1f7c0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1f7d0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1f7e0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1f7f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1f800 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1f810 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1f820 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1f830 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1f840 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1f850 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1f860 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1f870 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1f880 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1f890 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1f8a0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1f8b0 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1f8c0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1f8d0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1f8e0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1f8f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f900 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1f910 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1f920 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1f930 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1f940 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1f950 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1f960 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1f970 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1f980 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1f990 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1f9a0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1f9b0 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1f9c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1f9d0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1f9e0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1f9f0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1fa00 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1fa10 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1fa20 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1fa30 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1fa40 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1fa50 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1fa60 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1fa70 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1fa80 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1fa90 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1faa0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1fab0 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1fac0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1fad0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1fae0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1faf0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1fb00 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1fb10 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1fb20 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1fb30 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1fb40 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1fb50 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1fb60 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1fb70 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1fb80 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1fb90 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1fba0 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1fbb0 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1fbc0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1fbd0 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1fbe0 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1fbf0 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1fc00 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1fc10 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1fc20 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1fc30 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1fc40 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1fc50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fc60 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1fc70 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1fc80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1fc90 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1fca0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1fcb0 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1fcc0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1fcd0 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1fce0 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1fcf0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1fd00 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
1fd10 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
1fd20 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1fd30 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1fd40 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1fd50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd60 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1fd70 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1fd80 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1fd90 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1fda0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1fdb0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1fdc0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1fdd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1fde0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1fdf0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1fe00 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1fe10 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1fe20 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1fe30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1fe40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1fe50 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1fe60 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1fe70 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1fe80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1fe90 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1fea0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1feb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1fec0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1fed0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1fee0 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1fef0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1ff00 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1ff10 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1ff20 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1ff30 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1ff40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1ff50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ff60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1ff70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1ff80 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1ff90 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1ffa0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1ffb0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1ffc0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1ffd0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1ffe0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1fff0 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
20000 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
20010 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
20020 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
20030 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
20040 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
20050 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
20060 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
20070 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
20080 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
20090 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
200a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
200b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
200c0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
200d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
200e0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50  _UNLOCK );..  pP
200f0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
20100 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
20110 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
20120 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
20130 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
20140 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
20150 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  he. */.    int n
20160 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  Max;.    int h;.
20170 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
20180 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
20190 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c     rc = pagerAll
201a0 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72  ocatePage(pPager
201b0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
201c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
201d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
201e0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  c;.    }..    pP
201f0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
20200 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
20210 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65  DB || pgno>pPage
20220 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20  r->stmtSize );. 
20230 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
20240 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
20250 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
20260 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
20270 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
20280 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b  nc = 0;..    mak
20290 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
202a0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
202b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
202c0 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
202d0 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
202e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
202f0 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
20300 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
20310 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
20320 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
20330 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
20340 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
20350 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
20360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20380 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
203a0 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  }..    /* Popula
203b0 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68  te the page with
203c0 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79   data, either by
203d0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
203e0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
203f0 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65  * file, or by se
20400 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  tting the entire
20410 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20   page to zero.. 
20420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d     */.    if( nM
20430 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
20440 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74  MEMDB || (noCont
20450 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
20460 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20  alwaysRollback) 
20470 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
20480 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
20490 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
204a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
204b0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
204c0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
204d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
204e0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
204f0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
20500 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
20510 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
20520 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26  ad = noContent &
20530 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
20540 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  sRollback;.     
20550 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
20560 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
20570 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
20580 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20590 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
205a0 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
205b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
205c0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
205d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
205e0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
205f0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
20600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20610 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
20620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20630 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
20640 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
20650 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
20660 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
20670 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
20680 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
20690 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
206a0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
206b0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
206c0 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
206d0 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
206e0 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
206f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20700 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
20710 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
20720 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20730 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
20740 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
20750 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
20760 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
20770 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
20780 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
20790 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
207a0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
207b0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
207c0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
207d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
207e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
207f0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
20800 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
20810 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
20820 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50   pgno==1);.    P
20830 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
20840 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28  ->nHit);.    if(
20850 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
20860 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
20870 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
20880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
20890 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
208a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
208b0 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28   }.    page_ref(
208c0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
208d0 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
208e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
208f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20900 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
20910 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
20920 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
20930 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
20940 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
20950 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
20960 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
20970 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
20980 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
20990 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
209a0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
209b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
209c0 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
209d0 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
209e0 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
209f0 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
20a00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
20a10 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20a20 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
20a30 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
20a40 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
20a50 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70   noContent);.  p
20a60 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
20a70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20a80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  }.../*.** Acquir
20a90 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
20aa0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
20ab0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20ac0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
20ad0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
20ae0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
20af0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
20b00 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
20b10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
20b20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
20b30 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
20b40 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
20b50 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
20b60 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
20b70 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
20b80 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
20b90 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
20ba0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
20bb0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
20bc0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
20bd0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20be0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
20bf0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
20c00 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
20c10 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
20c20 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
20c30 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
20c40 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
20c50 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
20c60 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
20c70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20c80 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
20c90 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20  dr *pPg = 0;..  
20ca0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
20cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20cc0 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67  gno!=0 );..  pag
20cd0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20ce0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20cf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
20d00 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
20d10 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
20d20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
20d30 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65  siveMode );.  }e
20d40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20d50 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
20d60 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
20d70 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f  TE_FULL ){.    /
20d80 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
20d90 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67    }else if( (pPg
20da0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20db0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d  pPager, pgno))!=
20dc0 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65  0 ){.    page_re
20dd0 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  f(pPg);.  }.  pa
20de0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20df0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
20e00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
20e10 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
20e20 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20e30 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20e40 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
20e50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
20e60 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
20e70 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
20e80 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
20e90 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
20ea0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
20eb0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
20ec0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
20ed0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20ee0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
20ef0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20f00 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
20f10 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
20f20 2a 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  *pPager;..  if( 
20f30 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
20f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
20f50 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20f60 72 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  r;..  /* Decreme
20f70 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
20f80 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
20f90 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  page.  */.  asse
20fa0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
20fb0 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
20fc0 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
20fd0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20  pPg->nRef--;..  
20fe0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
20ff0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
21000 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
21010 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
21020 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
21030 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
21040 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
21050 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
21060 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
21070 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20  g->nRef==0 ){.. 
21080 20 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50     lruListAdd(pP
21090 67 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  g);.    if( pPag
210a0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
210b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
210c0 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
210d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
210e0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
210f0 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
21100 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
21110 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
21120 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
21130 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
21140 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
21150 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
21160 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
21170 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
21180 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
21190 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28  er->nRef==0 && (
211a0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
211b0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
211c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
211d0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e  ){.      pagerUn
211e0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
211f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21200 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
21210 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
21220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21230 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
21240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
21250 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
21260 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
21270 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
21280 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
21290 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
212a0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
212b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
212c0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
212d0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
212e0 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
212f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
21300 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
21310 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
21320 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
21330 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
21340 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
21350 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
21360 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
21370 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
21380 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
21390 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
213a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
213b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
213c0 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
213d0 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
213e0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
213f0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
21400 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21410 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
21420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21430 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
21440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21450 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21460 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
21470 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
21480 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 61 67  Pager, 0);.  pag
21490 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
214a0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
214b0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
214c0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
214d0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70  er->dbSize);.  p
214e0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
214f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
21500 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
21510 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21520 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
21530 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
21540 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20  _journal;.  }.. 
21550 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
21560 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  rnalOpen==0 ){. 
21570 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
21580 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
21590 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
215a0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
215b0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
215c0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
215d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
215e0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
215f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21600 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  NAL);.    }.#ifd
21610 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
21620 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
21630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
21640 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
21650 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
21660 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
21670 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
21680 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
21690 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c  ager).    );.#el
216a0 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
216b0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
216c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
216d0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
216e0 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
216f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
21700 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21710 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
21720 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ods );.    pPage
21730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
21740 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
21750 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
21760 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21770 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  lHdr = 0;.    if
21780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21790 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
217a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
217b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
217c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
217d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
217e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
217f0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
21800 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
21810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67      }.  }.  pPag
21820 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
21830 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
21840 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
21850 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
21860 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
21870 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
21880 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
21890 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
218a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
218b0 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
218c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
218d0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
218e0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
218f0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
21900 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
21910 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
21920 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
21930 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
21940 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
21950 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
21960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21980 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
21990 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
219a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
219b0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
219c0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
219d0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
219e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
219f0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
21a00 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ger, 0);.    if(
21a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21a30 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
21a40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21a50 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
21a60 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
21a70 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
21a80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
21a90 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
21aa0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
21ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21ac0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
21ad0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
21ae0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
21af0 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
21b00 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
21b10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21b20 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
21b30 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
21b40 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
21b50 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
21b60 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
21b70 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
21b80 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
21b90 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
21ba0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
21bb0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
21bc0 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
21bd0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
21be0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
21bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
21c00 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
21c10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
21c20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
21c30 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
21c40 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
21c50 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
21c60 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
21c70 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
21c80 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
21c90 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
21ca0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
21cb0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
21cc0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
21cd0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
21ce0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
21cf0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
21d00 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
21d10 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
21d20 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
21d30 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
21d40 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
21d50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
21d60 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
21d70 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
21d80 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
21d90 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
21da0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
21db0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
21dc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21dd0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
21de0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
21df0 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
21e00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
21e10 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
21e20 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
21e30 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
21e40 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
21e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
21e60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
21e70 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
21e80 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
21e90 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
21ea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
21eb0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
21ec0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
21ed0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
21ee0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
21ef0 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
21f00 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
21f10 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
21f20 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
21f30 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
21f40 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
21f50 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
21f60 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
21f70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
21f80 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
21f90 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
21fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
21fb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
21fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21fd0 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  K;.  pagerEnter(
21fe0 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
21ff0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
22000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
22010 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
22020 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
22030 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
22040 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
22050 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22060 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
22070 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  0 );.    if( MEM
22080 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
22090 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
220a0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
220b0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
220c0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
220d0 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
220e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
220f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
22100 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
22110 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
22120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22130 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
22140 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
22150 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
22160 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
22170 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22180 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
22190 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
221a0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
221b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
221c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
221d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
221e0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
221f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  er);.        ret
22200 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
22210 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
22220 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
22230 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
22240 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
22250 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
22260 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  er));.      if( 
22270 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
22280 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
22290 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20  empFile.        
222a0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
222b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
222c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
222d0 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  FF ){.        rc
222e0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
222f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
22300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22310 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
22320 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
22330 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22340 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
22350 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
22360 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
22370 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
22380 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
22390 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
223a0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
223b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
223c0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
223d0 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
223e0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
223f0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
22400 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
22410 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
22420 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
22430 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
22440 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
22450 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
22460 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
22470 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
22480 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
22490 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
224a0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
224b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
224c0 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
224d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
224e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
224f0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
22500 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
22510 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Pager, 0);.    p
22520 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
22530 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
22540 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
22550 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
22560 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
22570 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65  );.    pagerEnte
22580 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
22590 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  f( !pPager->pInJ
225a0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
225b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
225c0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
225d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
225e0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
225f0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
22600 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
22610 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
22620 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
22630 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
22640 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
22650 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
22660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22670 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
22680 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
22690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
226a0 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
226b0 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
226c0 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
226d0 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
226e0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
226f0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
22700 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
22710 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
22720 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
22730 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
22740 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
22750 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
22760 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
22770 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
22780 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
22790 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
227a0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
227b0 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
227c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
227d0 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
227e0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
227f0 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
22800 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
22810 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
22820 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
22830 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
22840 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
22850 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
22860 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
22870 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
22880 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
22890 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
228a0 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
228b0 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
228c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
228d0 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
228e0 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
228f0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
22900 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
22910 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
22920 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
22930 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
22940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22950 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
22960 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
22970 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
22980 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  ty->pDirty = pPg
22990 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
229a0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
229b0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
229c0 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
229d0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
229e0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
229f0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
22a00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
22a10 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
22a20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
22a30 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
22a40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
22a50 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
22a60 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
22a70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
22a80 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
22a90 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
22aa0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
22ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
22ac0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
22ad0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
22ae0 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
22af0 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
22b00 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
22b10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
22b20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
22b30 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
22b40 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
22b50 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
22b60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
22b70 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
22b80 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
22b90 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
22ba0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
22bb0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
22bc0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
22bd0 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
22be0 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
22bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22c00 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
22c10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
22c20 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
22c30 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
22c40 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
22c50 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
22c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
22c70 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
22c80 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
22c90 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
22ca0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
22cb0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
22cc0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
22cd0 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
22ce0 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
22cf0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
22d00 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
22d10 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
22d20 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
22d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22d40 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
22d50 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
22d60 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
22d70 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
22d80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
22d90 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
22da0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22db0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
22dc0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
22dd0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22de0 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
22df0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
22e00 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
22e10 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
22e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22e30 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
22e40 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
22e50 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
22e60 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
22e70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
22e80 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
22e90 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
22ea0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
22eb0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
22ec0 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
22ed0 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
22ee0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
22ef0 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
22f00 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
22f10 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
22f20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
22f30 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
22f40 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
22f50 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
22f60 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
22f70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
22f80 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
22f90 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
22fa0 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
22fb0 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
22fc0 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
22fd0 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
22fe0 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
22ff0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
23000 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
23010 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
23020 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
23030 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
23040 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23050 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23060 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
23070 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
23080 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
23090 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
230a0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
230b0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
230c0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
230d0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
230e0 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
230f0 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
23100 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53  rnal && (pageInS
23110 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
23120 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
23130 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
23140 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
23150 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
23160 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
23170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
23180 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
23190 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
231a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
231b0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
231c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
231d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
231e0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
231f0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
23200 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
23210 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
23220 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
23230 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
23240 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
23250 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
23260 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
23270 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
23280 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23290 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
232a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
232b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
232c0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
232d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
232e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
232f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23310 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
23320 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
23330 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
23340 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
23350 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
23360 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
23370 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
23380 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23390 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
233a0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
233b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
233c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
233d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
233e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
233f0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
23400 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
23410 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
23420 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
23430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
23440 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
23450 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
23460 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
23470 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
23480 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
23490 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
234a0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
234b0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
234c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
234d0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
234e0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
234f0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
23500 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
23510 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6a  al && (pPager->j
23520 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45  ournalOpen || ME
23530 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
23540 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
23550 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
23560 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
23570 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
23580 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
23590 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
235a0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
235b0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
235c0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a    PAGERTRACE3("J
235d0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
235e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
235f0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
23600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
23610 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
23620 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
23630 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
23640 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
23650 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  oc( pPager->page
23660 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
23670 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f    if( !pHist->pO
23680 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
23690 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
236a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
236b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
236c0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
236d0 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
236e0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
236f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23710 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
23720 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
23730 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20  ata2;..         
23740 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
23750 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
23760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
23770 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
23780 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
23790 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
237a0 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
237b0 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
237c0 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  fies.          *
237d0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
237e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
237f0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
23800 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
23810 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
23820 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
23830 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
23840 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
23850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
23860 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
23870 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
23880 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ata2);.         
23890 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
238a0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
238b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
238c0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
238d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
238e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
238f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23900 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
23910 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
23920 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
23930 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23960 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
23970 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
23980 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
23990 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
239a0 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  +4;.          }.
239b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
239c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
239d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
239e0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
239f0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
23a00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
23a10 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  um);.           
23a20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23a30 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
23a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23a50 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
23a60 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
23a70 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
23a80 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
23a90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23aa0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
23ab0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
23ac0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f            PAGER_
23ad0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
23ae0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
23af0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
23b00 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c  RTRACE5("JOURNAL
23b10 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
23b20 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
23b30 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
23b40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
23b50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
23b60 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
23b70 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
23b80 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  pPg));..        
23b90 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
23ba0 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
23bb0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
23bc0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
23bd0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
23be0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
23bf0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
23c00 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
23c10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23c20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23c30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23c40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23c50 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
23c60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
23c70 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
23c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23c90 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
23ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
23cb0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
23cc0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
23cd0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23ce0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
23cf0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
23d00 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
23d10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
23d20 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
23d30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
23d40 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
23d50 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
23d60 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  no);.          }
23d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23d90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
23da0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
23db0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
23dc0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
23dd0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
23de0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
23df0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
23e00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23e10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
23e20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
23e30 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
23e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23e50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
23e60 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
23e70 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
23e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
23e90 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
23ea0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
23eb0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
23ec0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
23ed0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
23ee0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
23ef0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
23f00 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
23f10 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
23f20 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
23f30 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
23f40 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
23f50 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
23f60 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
23f70 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
23f80 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
23f90 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
23fa0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
23fb0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
23fc0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23fd0 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20  stmtInUse .     
23fe0 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d  && !pageInStatem
23ff0 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26  ent(pPg) .     &
24000 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
24010 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
24020 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
24030 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
24040 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
24050 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
24060 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
24070 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
24080 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
24090 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
240a0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
240b0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
240c0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
240d0 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
240e0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
240f0 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  t = sqlite3PageM
24100 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70  alloc( pPager->p
24110 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
24120 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
24130 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
24140 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
24150 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
24160 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
24170 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
24180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
24190 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
241a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
241b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
241c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
241d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  no);.        pag
241e0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
241f0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
24200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
24210 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
24220 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70  r->stmtNRec*(4+p
24230 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
24240 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
24250 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
24260 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
24270 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
24280 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
24290 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73  32bits(pPager->s
242a0 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67  tfd, offset, pPg
242b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
242c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
242d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
242e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
242f0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ite(pPager->stfd
24300 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
24310 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
24320 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+4);.        }
24330 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
24340 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
24350 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
24360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
24370 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
24380 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
24390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
243a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
243b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
243c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
243d0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
243e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
243f0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
24400 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
24410 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
24420 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
24430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
24450 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
24460 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
24470 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
24480 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
24490 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
244a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
244b0 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
244c0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
244d0 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
244e0 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  gno;.    if( !ME
244f0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
24500 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
24510 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
24520 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
24530 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
24540 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
24570 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20   used to mark a 
24580 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69  data-page as wri
24590 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a  table. It uses .
245a0 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  ** pager_write()
245b0 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e   to open a journ
245c0 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69  al file (if it i
245d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
245e0 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  en).** and write
245f0 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61   the page *pData
24600 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
24610 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
24620 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
24630 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
24640 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
24650 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
24660 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
24670 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
24680 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
24690 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
246a0 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
246b0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
246c0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
246d0 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
246e0 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
246f0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
24700 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
24710 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
24720 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24730 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
24740 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
24750 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24760 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
24770 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
24780 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24790 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
247a0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
247b0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
247c0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
247d0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65  geSize);..  page
247e0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
247f0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
24800 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
24810 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
24820 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
24830 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
24840 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
24850 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
24860 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24880 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
24890 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
248a0 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
248b0 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248d0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
248e0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
248f0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
24900 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
24910 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
24920 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
24930 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
24940 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
24950 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
24960 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
24970 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
24980 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
24990 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
249a0 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
249b0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
249c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
249d0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
249e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
249f0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
24a00 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
24a10 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
24a20 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
24a30 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
24a40 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
24a50 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
24a60 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
24a70 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
24a80 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
24a90 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
24aa0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
24ab0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
24ac0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
24ad0 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
24ae0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
24af0 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
24b00 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
24b10 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
24b20 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
24b30 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
24b40 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
24b50 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
24b60 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
24b70 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
24b80 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
24b90 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
24ba0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
24bb0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
24bc0 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
24bd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24be0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
24bf0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
24c00 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
24c10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
24c20 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
24c30 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
24c40 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
24c50 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
24c60 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
24c70 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
24c80 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
24c90 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
24ca0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
24cb0 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
24cc0 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
24cd0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
24ce0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
24cf0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
24d00 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
24d10 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
24d20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24d30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
24d40 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
24d50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
24d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24d70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24d80 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
24d90 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
24da0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24db0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
24dc0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
24dd0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
24de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24df0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24e00 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
24e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24e20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
24e30 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
24e40 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
24e50 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
24e60 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
24e70 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
24e80 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
24e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24ea0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24eb0 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
24ec0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
24ed0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
24ee0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
24ef0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
24f00 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
24f10 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
24f20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
24f30 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
24f40 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
24f50 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
24f60 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
24f70 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
24f80 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
24f90 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
24fa0 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
24fb0 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
24fc0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
24fd0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
24fe0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
24ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25010 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
25020 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
25030 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
25040 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
25050 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
25060 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
25070 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
25080 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
25090 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
250a0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
250b0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
250c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
250d0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
250e0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
250f0 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
25100 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
25110 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
25120 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
25130 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
25140 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
25150 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
25160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
25170 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
25180 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
25190 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
251a0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
251b0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
251c0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
251d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
251e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
251f0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
25200 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
25210 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
25220 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
25230 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
25240 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
25250 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
25260 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
25270 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
25280 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
25290 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
252a0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
252b0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
252c0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
252d0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
252e0 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
252f0 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
25300 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
25310 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
25320 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
25330 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
25340 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
25350 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
25360 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
25370 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
25380 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
25390 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
253a0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
253b0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
253c0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
253d0 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
253e0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
253f0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
25400 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
25410 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
25420 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
25430 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
25440 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
25450 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
25460 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
25470 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
25480 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
25490 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
254a0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
254b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
254c0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
254d0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
254e0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
254f0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
25500 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
25510 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
25520 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
25530 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
25540 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
25550 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
25560 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
25570 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
25580 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
25590 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
255a0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
255b0 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
255c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
255d0 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
255e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
255f0 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
25600 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
25610 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
25620 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
25630 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
25640 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
25650 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
25660 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
25670 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25680 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
25690 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
256a0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
256b0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
256c0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
256d0 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
256e0 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
256f0 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
25700 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
25710 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
25720 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
25730 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
25740 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
25750 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
25760 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
25770 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  tWrite(DbPage *p
25780 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  DbPage){.  PgHdr
25790 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
257a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
257b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
257c0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
257d0 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e  eturn;.  pagerEn
257e0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ter(pPager);.  p
257f0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
25800 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
25810 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
25820 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
25830 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
25840 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
25850 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
25860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
25870 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
25880 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
25890 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
258a0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
258b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
258c0 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
258d0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
258e0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
258f0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
25900 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
25910 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
25920 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
25930 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
25940 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
25950 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25960 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
25970 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
25980 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
25990 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
259a0 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
259b0 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
259c0 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
259d0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
259e0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
259f0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
25a00 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
25a10 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
25a20 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
25a30 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
25a40 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
25a50 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
25a60 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
25a70 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
25a80 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
25a90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
25aa0 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
25ab0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
25ac0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
25ad0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
25ae0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
25af0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
25b00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
25b10 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
25b20 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
25b30 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ).      makeClea
25b40 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  n(pPg);.#ifdef S
25b50 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
25b60 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
25b70 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25b80 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
25b90 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
25ba0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
25bb0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  r);.}../*.** A c
25bc0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
25bd0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
25be0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
25bf0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
25c00 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
25c10 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
25c20 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
25c30 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
25c40 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
25c50 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
25c60 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
25c70 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
25c80 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
25c90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
25ca0 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
25cb0 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
25cc0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
25cd0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
25ce0 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
25cf0 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
25d00 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
25d10 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
25d20 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
25d30 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
25d40 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
25d50 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
25d60 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
25d70 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
25d80 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
25d90 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
25da0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25db0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
25dc0 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
25dd0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
25de0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
25df0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
25e00 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
25e10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
25e20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
25e30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
25e40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
25e50 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
25e60 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
25e70 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
25e80 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
25e90 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
25ea0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
25eb0 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
25ec0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
25ed0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
25ee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
25ef0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70  rnalOpen==0 || p
25f00 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
25f10 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
25f20 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
25f30 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
25f40 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
25f50 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
25f60 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f  ( !MEMDB );    /
25f70 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70  * For a memdb, p
25f80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
25f90 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a  en is always 0 *
25fa0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
25fb0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
25fc0 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
25fd0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
25fe0 3e 70 67 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e  >pgno > pPager->
25ff0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
26000 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
26010 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45  ndif..  /* If SE
26020 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64  CURE_DELETE is d
26030 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
26040 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68  ere is no way th
26050 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75  at this.  ** rou
26060 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
26070 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72  ed on a page for
26080 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50 61   which sqlite3Pa
26090 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20  gerDontWrite(). 
260a0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
260b0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
260c0 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 61  ed during the sa
260d0 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  me transaction..
260e0 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74    ** And if Dont
260f0 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65 76  Write() has prev
26100 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c  iously been call
26110 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed, the followin
26120 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  g.  ** condition
26130 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20  s must be met.. 
26140 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
26150 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
26160 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
26170 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
26180 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65  bSize );..  asse
26190 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
261a0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
261b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
261c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
261d0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
261e0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
261f0 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65   = 1;.  pPg->nee
26200 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66 28  dRead = 0;.  if(
26210 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
26220 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
26230 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
26240 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze >= pPager->or
26250 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
26260 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
26270 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
26280 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
26290 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
262a0 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
262b0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
262c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
262d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
262e0 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
262f0 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
26300 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
26310 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
26320 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
26330 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
26340 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
26350 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
26360 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
26370 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
26380 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
26390 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
263a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
263b0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
263c0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
263d0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
263e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
263f0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
26400 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
26410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26420 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
26430 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
26440 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
26450 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
26460 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
26470 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
26480 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
26490 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
264a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
264b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
264c0 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44  c;..    if( !isD
264d0 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72  irect ){.      r
264e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
264f0 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
26500 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26520 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
26530 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
26540 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26560 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
26570 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
26580 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
26590 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
265a0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
265b0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
265c0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
265d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
265e0 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
265f0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
26600 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
26610 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
26620 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
26630 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
26640 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
26650 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
26660 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
26670 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
26680 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
26690 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72  pPgHdr);.      r
266a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
266b0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
266c0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
266d0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d  eSize, 0);.    }
266e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
266f0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
26700 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
26710 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
26720 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
26730 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
26740 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
26750 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26760 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
26770 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a   file to disk..*
26780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26790 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
267a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
267b0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
267c0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
267d0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
267e0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
267f0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70  sync_flags);.  p
26800 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26820 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
26830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26840 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
26850 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
26860 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
26870 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
26880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
26890 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
268a0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
268b0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
268c0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
268d0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
268e0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
268f0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
26900 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
26910 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
26920 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
26930 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
26940 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
26950 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
26960 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
26970 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
26980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26990 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
269a0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
269b0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
269c0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
269d0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
269e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
269f0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
26a00 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
26a10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
26a20 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
26a30 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
26a40 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
26a50 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
26a60 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
26a70 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
26a80 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
26a90 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
26aa0 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
26ab0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
26ac0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
26ad0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
26ae0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
26af0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
26b00 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
26b10 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
26b20 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
26b30 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s)..**.** If the
26b40 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
26b50 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
26b60 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
26b70 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
26b80 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
26b90 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
26ba0 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
26bb0 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
26bc0 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
26bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26be0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
26bf0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
26c00 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
26c10 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
26c20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
26c30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26c40 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
26c50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
26c60 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
26c70 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67   *zMaster, .  Pg
26c80 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74  no nTrunc,.  int
26c90 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74   noSync.){.  int
26ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26cb0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
26cc0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
26cd0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
26ce0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
26cf0 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68   If no changes h
26d00 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77  ave been made, w
26d10 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20  e can leave the 
26d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c  transaction earl
26d30 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
26d40 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
26d50 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28  ==0 &&.        (
26d60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26d70 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
26d80 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
26d90 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
26da0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26db0 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
26dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
26dd0 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
26de0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
26df0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
26e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26e10 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
26e20 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
26e30 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
26e40 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
26e50 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
26e60 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
26e70 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70  er, nTrunc);.  p
26e80 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
26e90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
26ea0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
26eb0 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
26ec0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
26ed0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
26ee0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
26ef0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
26f00 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
26f10 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
26f20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
26f30 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
26f40 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
26f50 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
26f60 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a     PgHdr *pPg;..
26f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26f80 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
26f90 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
26fa0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
26fb0 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
26fc0 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
26fd0 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
26fe0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
26ff0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
27000 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
27010 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
27020 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
27030 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
27040 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
27050 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
27060 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
27070 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
27080 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
27090 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
270a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
270b0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
270c0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
270d0 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
270e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
270f0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
27100 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
27110 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
27120 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
27130 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
27140 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
27150 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
27160 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
27170 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f  /.    int useAto
27180 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
27190 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
271a0 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
271b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
271c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
271d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
271e0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
271f0 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
27200 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20  nTrunc==0 && .  
27210 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72        (0==pPager
27220 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70  ->pDirty || 0==p
27230 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
27240 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20  Dirty).    );.  
27250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27260 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
27270 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27280 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
27290 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
272a0 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63     if( useAtomic
272b0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
272c0 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
272d0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
272e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
272f0 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
27300 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
27310 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
27320 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
27330 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
27340 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
27350 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
27360 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
27370 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
27380 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
27390 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
273a0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
273b0 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
273c0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
273d0 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
273e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
273f0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
27400 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
27410 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
27420 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
27430 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
27440 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
27450 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
27460 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
27470 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
27480 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
27490 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
274a0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
274b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
274c0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
274d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
274e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
274f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
27500 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
27510 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
27520 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
27530 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27540 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
27550 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
27560 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
27570 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26  seAtomicWrite &&
27580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27590 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
275a0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
275b0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
275c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
275d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
275e0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
275f0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
27600 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
27610 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
27620 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
27630 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
27640 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
27650 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
27660 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
27670 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
27680 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
27690 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
276a0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
276b0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
276c0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
276d0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
276e0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
276f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27700 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
27710 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
27720 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
27730 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
27740 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
27750 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27760 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
27770 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
27780 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
27790 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
277a0 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65 66  E_OFF ){.#ifndef
277b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
277c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
277d0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
277e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
277f0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
27800 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
27810 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
27820 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
27830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69            ** bei
27840 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
27850 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
27860 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
27870 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
27880 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
27890 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
278a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
278b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
278c0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
278d0 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20  GNO(pPager);.   
278e0 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
278f0 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
27900 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
27910 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
27920 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
27930 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
27940 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
27950 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
27970 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
27980 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
27990 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
279a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
279b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
279c0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
279d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
279e0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
279f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
27a00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
27a10 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
27a20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27a30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
27a40 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
27a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27a60 20 7d 20 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   } .        }.#e
27a70 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20  ndif.        rc 
27a80 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
27a90 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
27aa0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ster);.        i
27ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27ac0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27ad0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
27ae0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
27af0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
27b00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
27b10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27b20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e  sync_exit;..#ifn
27b30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27b40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
27b50 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
27b60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27b70 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
27b80 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
27b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27bb0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
27bc0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
27bd0 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
27be0 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
27bf0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
27c00 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
27c10 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
27c20 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
27c30 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
27c40 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
27c50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
27c70 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
27c80 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
27c90 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;.      /* The e
27ca0 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  rror might have 
27cb0 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20 6c  left the dirty l
27cc0 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75  ist all fouled u
27cd0 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a  p here,.      **
27ce0 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e   but that does n
27cf0 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75 73  ot matter becaus
27d00 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65 20  e if the if the 
27d10 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20  dirty list did. 
27d20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72       ** get corr
27d30 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  upted, then the 
27d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
27d50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20   roll back and. 
27d60 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20       ** discard 
27d70 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20  the dirty list. 
27d80 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73 73   There is an ass
27d90 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ert in.      ** 
27da0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
27db0 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61 74  rty_pages() that
27dc0 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6e   verifies that n
27dd0 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20  o attempt.      
27de0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73  ** is made to us
27df0 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72  e an invalid dir
27e00 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ty list..      *
27e10 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e  /.      goto syn
27e20 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  c_exit;.    }.  
27e30 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
27e40 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
27e50 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
27e60 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
27e70 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
27e80 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
27e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ea0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
27eb0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
27ec0 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
27ed0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
27ee0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
27ef0 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
27f00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
27f10 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
27f20 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
27f30 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
27f40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
27f50 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
27f60 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
27f70 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  c_exit:.  if( rc
27f80 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
27f90 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a  LOCKED ){.    /*
27fa0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
27fb0 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20  gecounter() may 
27fc0 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
27fd0 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  n an exclusive. 
27fe0 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70      * lock to sp
27ff0 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e  ill the cache an
28000 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42  d return IOERR_B
28010 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63  LOCKED. But sinc
28020 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20  e .     * there 
28030 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65  is no chance the
28040 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73   cache is incons
28050 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20  istent, it is.  
28060 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72     * better to r
28070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
28080 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72  Y..     */.    r
28090 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
280a0 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
280b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
280c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
280d0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
280e0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
280f0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
28100 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
28110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
28120 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
28130 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
28140 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
28150 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
28160 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28170 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
28180 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
28190 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
281a0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
281b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
281c0 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
281d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
281e0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
281f0 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
28200 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
28210 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28220 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
28230 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
28240 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
28250 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28260 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
28270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
28280 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20  Modified==0 &&. 
28290 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
282a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
282b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
282c0 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20  ELETE ||.       
282d0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
282e0 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a  siveMode!=0) ){.
282f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
28300 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
28310 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 || pPager->jou
28320 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
28330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28340 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  _OK;.  }.  pager
28350 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
28360 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
28370 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
28380 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
28390 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
283a0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
283b0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
283c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
283d0 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
283e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
283f0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
28400 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
28410 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
28420 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
28430 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
28440 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
28450 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
28460 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
28470 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
28480 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
28490 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
284a0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
284b0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
284c0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
284d0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
284e0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
284f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
28500 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
28510 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
28520 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
28530 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
28540 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
28550 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
28560 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
28570 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
28580 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
28590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
285a0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
285b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
285c0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
285d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
285e0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
285f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
28600 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
28610 52 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  RED;.    pagerLe
28620 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
28630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28640 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
28650 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
28660 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
28670 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
28680 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
28690 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
286a0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
286b0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
286c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
286d0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
286e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
286f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
28700 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
28710 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
28720 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
28730 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
28740 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
28750 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
28760 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
28770 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
28780 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
28790 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
287a0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
287b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
287c0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
287d0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
287e0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
287f0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
28800 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
28810 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
28820 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
28830 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
28840 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
28850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28860 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
28870 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
28880 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
28890 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
288a0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
288b0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
288c0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
288d0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
288e0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
288f0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
28900 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
28910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
28920 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
28930 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
28940 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41  t rc;.  PAGERTRA
28950 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
28960 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28970 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
28980 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
28990 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
289a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
289b0 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
289c0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
289d0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
289e0 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
289f0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
28a00 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
28a10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28a20 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
28a30 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
28a40 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
28a50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
28a60 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
28a70 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
28a80 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
28a90 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
28aa0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28ab0 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
28ac0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
28ad0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
28ae0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
28af0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
28b00 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
28b10 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
28b20 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
28b30 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50  Size);.        P
28b40 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c  AGERTRACE3("ROLL
28b50 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
28b60 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
28b70 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28b80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28b90 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28ba0 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
28bb0 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
28bc0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
28bd0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
28be0 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
28bf0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
28c00 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
28c10 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
28c20 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
28c30 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
28c40 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
28c50 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
28c60 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
28c70 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
28c80 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
28c90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28ca0 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
28cb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28cd0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
28ce0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
28cf0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
28d00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
28d10 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
28d20 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Size;.    pager_
28d30 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
28d40 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
28d50 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
28d60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
28d70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
28d80 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
28d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
28da0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
28db0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ger);.  if( !pPa
28dc0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
28dd0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
28de0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
28df0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
28e00 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
28e10 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
28e20 74 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c  ter);.    pagerL
28e30 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
28e50 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
28e60 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
28e70 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
28e80 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
28e90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
28ea0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
28eb0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
28ec0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
28ed0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
28ee0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
28ef0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  r);.    return p
28f00 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
28f10 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
28f20 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
28f30 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
28f40 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
28f50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
28f60 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
28f70 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
28f80 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
28f90 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
28fa0 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
28fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
28fd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
28fe0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28ff0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
29000 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67  0);.  }.  /* pag
29010 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
29020 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
29030 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
29040 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
29050 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
29060 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
29070 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
29080 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
29090 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
290a0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
290b0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
290c0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
290d0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
290e0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
290f0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
29100 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
29110 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29130 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
29140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29150 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
29160 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
29170 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
29180 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
29190 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
291a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
291b0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
291c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
291d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
291e0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
291f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
29200 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
29210 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
29220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
29230 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
29240 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29250 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
29260 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
29270 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
29280 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
29290 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
292a0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
292b0 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
292c0 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
292d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
292e0 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
292f0 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
29300 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
29310 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
29320 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
29330 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
29340 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29350 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
29360 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
29370 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
29380 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
29390 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
293a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
293b0 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
293c0 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
293d0 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
293e0 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
293f0 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
29400 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
29410 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e    return a;.}.in
29420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
29430 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61  Memdb(Pager *pPa
29440 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d  ger){.  return M
29450 45 4d 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  EMDB;.}.#endif..
29460 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
29470 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
29480 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
29490 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
294a0 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
294b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
294c0 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
294d0 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
294e0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
294f0 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
29500 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
29510 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
29520 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
29530 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
29540 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
29550 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
29560 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
29570 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
29580 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
29590 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
295a0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
295b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
295c0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
295d0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
295e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
295f0 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45  ize>=0 );.  PAGE
29600 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45  RTRACE2("STMT-BE
29610 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
29620 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
29630 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
29640 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
29650 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
29660 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
29670 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29690 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
296a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
296b0 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
296c0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
296d0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
296e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
296f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29700 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
29710 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
29720 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
29730 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d  Pager->pInStmt==
29740 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  0 );.  pPager->p
29750 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33  InStmt = sqlite3
29760 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
29770 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
29780 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29790 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
297a0 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->pInStmt==0 ){.
297b0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
297c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
297d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
297e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
297f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
29800 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
29810 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
29820 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
29830 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
29840 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29850 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
29860 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
29870 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
29880 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
29890 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
298a0 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
298b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
298c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
298d0 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
298e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
298f0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28  OURNAL);.    if(
29900 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
29910 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
29920 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
29930 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
29940 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
29950 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
29960 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
29970 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
29980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29990 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
299a0 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
299b0 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->pInStmt ){.  
299c0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
299d0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
299e0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
299f0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
29a00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29a10 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
29a20 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
29a30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29a40 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
29a50 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
29a60 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42   rc = pagerStmtB
29a70 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
29a80 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
29a90 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
29aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
29ab0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
29ac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29ad0 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
29ae0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61  r *pPager){.  pa
29af0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29b00 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29b10 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
29b20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
29b30 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52  ext;.    PAGERTR
29b40 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
29b50 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
29b60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
29b70 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
29b80 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
29b90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
29ba0 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
29bb0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
29bc0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
29bd0 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  pInStmt);.      
29be0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
29bf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29c00 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
29c10 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
29c20 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
29c30 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
29c40 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
29c50 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
29c60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
29c70 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
29c80 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
29c90 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
29ca0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
29cb0 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
29cc0 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
29cd0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
29ce0 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
29cf0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
29d00 74 65 33 50 61 67 65 46 72 65 65 28 70 48 69 73  te3PageFree(pHis
29d10 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
29d20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
29d30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
29d40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
29d50 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
29d60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
29d70 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
29d80 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
29d90 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
29da0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
29db0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
29dc0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
29dd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29de0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
29df0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
29e00 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
29e10 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
29e20 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
29e30 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
29e40 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
29e50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29e60 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
29e70 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
29e80 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
29e90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
29ea0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
29eb0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
29ec0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
29ed0 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
29ee0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
29ef0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
29f00 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
29f10 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
29f20 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
29f30 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
29f40 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
29f50 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
29f60 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
29f70 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
29f80 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
29f90 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
29fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
29fb0 67 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  geFree(pHist->pS
29fc0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
29fd0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
29fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29ff0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2a000 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
2a010 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
2a020 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
2a030 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
2a040 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2a050 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
2a060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2a070 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
2a080 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
2a090 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2a0a0 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
2a0b0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2a0c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a0d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
2a0e0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
2a0f0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
2a100 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
2a110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2a120 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
2a130 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
2a140 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
2a150 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2a160 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
2a170 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2a180 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2a190 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
2a1a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2a1b0 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
2a1c0 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
2a1d0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
2a1e0 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
2a1f0 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
2a200 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2a210 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
2a220 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
2a230 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
2a240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a250 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
2a260 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
2a270 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
2a280 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
2a290 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
2a2a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
2a2b0 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
2a2c0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
2a2d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2a2e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2a2f0 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
2a300 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
2a310 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
2a320 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
2a330 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
2a340 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
2a350 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2a360 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
2a370 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
2a380 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2a390 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2a3a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2a3b0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2a3c0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2a3d0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
2a3e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a3f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2a400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2a410 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
2a420 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
2a430 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
2a440 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
2a450 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
2a460 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
2a470 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
2a480 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
2a490 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2a4a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2a4b0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
2a4c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2a4d0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
2a4e0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
2a4f0 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
2a500 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
2a510 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
2a520 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
2a530 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2a540 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2a550 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
2a560 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
2a570 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
2a580 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
2a590 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
2a5a0 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
2a5b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a5c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2a5d0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2a5e0 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
2a5f0 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
2a600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
2a610 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
2a620 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2a630 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
2a640 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
2a650 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
2a660 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
2a670 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
2a680 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
2a690 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
2a6a0 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65   previous locate
2a6b0 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
2a6c0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
2a6d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
2a6e0 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
2a6f0 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
2a700 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
2a710 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
2a720 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
2a730 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
2a740 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
2a750 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
2a760 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
2a770 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
2a780 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
2a790 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
2a7a0 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
2a7b0 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
2a7c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
2a7d0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
2a7e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
2a7f0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
2a800 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2a810 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
2a820 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
2a830 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
2a840 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
2a850 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
2a860 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
2a870 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
2a880 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
2a890 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
2a8a0 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
2a8b0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
2a8c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
2a8d0 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ive)..*/.int sql
2a8e0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
2a8f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
2a900 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
2a910 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
2a920 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
2a930 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
2a940 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
2a950 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
2a960 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
2a970 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
2a980 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
2a990 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
2a9a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
2a9b0 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
2a9c0 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
2a9d0 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
2a9e0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2a9f0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
2aa00 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
2aa10 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
2aa20 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
2aa30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2aa40 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
2aa50 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
2aa60 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
2aa70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
2aa80 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
2aa90 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
2aaa0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2aab0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
2aac0 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  t)pgno>pPager->o
2aad0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
2aae0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
2aaf0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
2ab00 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
2ab10 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
2ab20 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
2ab30 20 69 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20   its hash-chain 
2ab40 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
2ab50 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
2ab60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ab70 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
2ab80 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
2ab90 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
2aba0 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
2abb0 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
2abc0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
2abd0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
2abe0 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
2abf0 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
2ac00 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
2ac10 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
2ac20 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
2ac30 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
2ac40 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
2ac50 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  */.  pPg->needSy
2ac60 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64  nc = 0;.  pPgOld
2ac70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
2ac80 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
2ac90 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
2aca0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
2acb0 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
2acc0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
2acd0 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
2ace0 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
2acf0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50  (pPgOld);.    pP
2ad00 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50  g->needSync = pP
2ad10 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a  gOld->needSync;.
2ad20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
2ad30 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
2ad40 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75    }.  pPg->inJou
2ad50 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
2ad60 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2ad70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
2ad80 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65  o);..  /* Change
2ad90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2ada0 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
2adb0 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
2adc0 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
2add0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
2ade0 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
2adf0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
2ae00 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
2ae10 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
2ae20 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
2ae30 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
2ae40 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
2ae50 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
2ae60 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2ae70 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
2ae80 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
2ae90 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
2aea0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
2aeb0 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
2aec0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
2aed0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
2aee0 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
2aef0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
2af00 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
2af10 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
2af20 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
2af30 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
2af40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
2af50 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
2af60 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
2af70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
2af80 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
2af90 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
2afa0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
2afb0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
2afc0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
2afd0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
2afe0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
2aff0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
2b000 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
2b010 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
2b020 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2b030 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65   bit has been se
2b040 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
2b050 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20   be remedied by 
2b060 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74  loading.    ** t
2b070 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
2b080 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
2b090 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
2b0a0 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
2b0b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b0c0 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
2b0d0 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
2b0e0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
2b0f0 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
2b100 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
2b110 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
2b120 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
2b130 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
2b140 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
2b150 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
2b160 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
2b170 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
2b180 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
2b190 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2b1a0 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
2b1b0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2b1c0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2b1d0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
2b1e0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
2b1f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
2b200 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
2b210 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
2b220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b230 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
2b240 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
2b250 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b260 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
2b270 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
2b280 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
2b290 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
2b2a0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
2b2b0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
2b2c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
2b2d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2b2e0 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   rc;.    PgHdr *
2b2f0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
2b300 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
2b310 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
2b320 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2b330 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
2b340 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
2b350 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b370 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
2b380 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e  ournal && (int)n
2b390 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
2b3a0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
2b3b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b3c0 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
2b3d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2b3e0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b  , needSyncPgno);
2b3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b400 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
2b410 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b420 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
2b430 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
2b440 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
2b450 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2b460 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
2b470 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
2b480 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
2b490 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2b4a0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
2b4b0 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65   }..  pagerLeave
2b4c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
2b4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b4e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
2b4f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2b500 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
2b510 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2b520 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
2b530 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2b540 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2b550 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
2b560 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
2b570 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
2b580 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
2b590 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
2b5a0 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
2b5b0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
2b5c0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
2b5d0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
2b5e0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
2b5f0 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
2b600 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
2b610 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2b620 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2b630 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54   (pPager?PGHDR_T
2b640 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
2b650 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger):0);.}../*.*
2b660 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
2b670 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
2b680 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
2b690 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
2b6a0 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
2b6b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
2b6c0 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
2b6d0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2b6e0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
2b6f0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2b700 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
2b710 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
2b720 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
2b730 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
2b740 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
2b750 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
2b760 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
2b770 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
2b780 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b790 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
2b7a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2b7b0 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
2b7c0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
2b7d0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
2b7e0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
2b7f0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
2b800 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
2b810 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
2b820 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
2b830 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2b840 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b850 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
2b860 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
2b870 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b880 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
2b890 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2b8a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2b8b0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2b8c0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2b8d0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
2b8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2b8f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b900 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
2b910 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2b920 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
2b930 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
2b940 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2b950 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
2b960 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2b970 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65   eMode;.  }.  re
2b980 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
2b990 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
2b9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
2b9b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
2b9c0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
2b9d0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
2b9e0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
2b9f0 2a 20 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e  * of PAGER_JOURN
2ba00 41 4c 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  ALMODE_QUERY, PA
2ba10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ba20 44 45 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41  DELETE or .** PA
2ba30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ba40 50 45 52 53 49 53 54 2e 20 49 66 20 74 68 65 20  PERSIST. If the 
2ba50 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2ba60 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
2ba70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
2ba80 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
2ba90 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
2baa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2bab0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
2bac0 68 65 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  her PAGER_JOURNA
2bad0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a  LMODE_DELETE or.
2bae0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
2baf0 4d 4f 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e  MODE_PERSIST, in
2bb00 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
2bb10 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
2bb20 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e  pdated).** journ
2bb30 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
2bb40 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2bb50 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
2bb60 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
2bb70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
2bb80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2bb90 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
2bba0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
2bbb0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2bbc0 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
2bbd0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2bbe0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2bbf0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
2bc00 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2bc10 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2bc20 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
2bc30 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
2bc40 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
2bc50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2bc60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
2bc70 45 54 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  ETE>=0 && PAGER_
2bc80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2bc90 49 53 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IST>=0 );.  if( 
2bca0 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20  eMode>=0 ){.    
2bcb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2bcc0 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
2bcd0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
2bce0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bcf0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
2bd00 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
2bd10 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
2bd20 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
2bd30 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71  files..*/.i64 sq
2bd40 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2bd50 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72  lSizeLimit(Pager
2bd60 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c   *pPager, i64 iL
2bd70 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69  imit){.  if( iLi
2bd80 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70  mit>=-1 ){.    p
2bd90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2bda0 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  zeLimit = iLimit
2bdb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2bdc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
2bdd0 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64  zeLimit;.}..#ifd
2bde0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2bdf0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
2be00 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
2be10 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
2be20 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
2be30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2be40 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
2be50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2be60 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
2be70 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2be80 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2be90 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2bea0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
2beb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2bec0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2bed0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
2bee0 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
2bef0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
2bf00 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
2bf10 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
2bf20 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
2bf30 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
2bf40 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
2bf50 20 2a 2f 0a                                       */.