/ Hex Artifact Content
Login

Artifact fae75270b4e2b2542b905791087f0c52142974f8:


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 30  : pager.c,v 1.40
0350: 33 20 32 30 30 38 2f 30 31 2f 32 31 20 31 33 3a  3 2008/01/21 13:
0360: 30 34 3a 33 35 20 64 61 6e 69 65 6c 6b 31 39 37  04:35 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: 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
24e0: 6e 61 6c 5b 28 70 67 6e 6f 2d 31 29 2f 38 5d 20  nal[(pgno-1)/8] 
24f0: 26 20 28 31 3c 3c 28 28 70 67 6e 6f 2d 31 29 25  & (1<<((pgno-1)%
2500: 38 29 29 21 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20  8))!=0.**.**    
2510: 20 54 68 65 20 70 50 61 67 65 72 2d 3e 61 49 6e   The pPager->aIn
2520: 4a 6f 75 72 6e 61 6c 5b 5d 20 61 72 72 61 79 20  Journal[] array 
2530: 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
2540: 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  r the original.*
2550: 2a 20 20 20 20 20 70 61 67 65 73 20 6f 66 20 74  *     pages of t
2560: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 74  he database, not
2570: 20 6e 65 77 20 70 61 67 65 73 20 74 68 61 74 20   new pages that 
2580: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
2590: 20 65 6e 64 0a 2a 2a 20 20 20 20 20 6f 66 20 74   end.**     of t
25a0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20  he database, so 
25b0: 6f 62 76 69 6f 75 73 6c 79 20 74 68 65 20 61 62  obviously the ab
25c0: 6f 76 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  ove expression c
25d0: 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20  annot be.**     
25e0: 76 61 6c 69 64 20 66 6f 72 20 6e 65 77 20 70 61  valid for new pa
25f0: 67 65 73 2e 20 20 46 6f 72 20 6e 65 77 20 70 61  ges.  For new pa
2600: 67 65 73 20 69 6e 4a 6f 75 72 6e 61 6c 20 69 73  ges inJournal is
2610: 20 61 6c 77 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a   always 0..**.**
2620: 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20   dirty.**.**    
2630: 20 57 68 65 6e 20 74 72 75 65 2c 20 74 68 69 73   When true, this
2640: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2650: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
2660: 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  age has been.** 
2670: 20 20 20 20 6d 6f 64 69 66 69 65 64 20 61 6e 64      modified and
2680: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
2690: 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
26a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
26b0: 2a 2a 20 20 20 20 20 49 66 20 66 61 6c 73 65 2c  **     If false,
26c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65   it means that e
26d0: 69 74 68 65 72 20 74 68 65 20 63 6f 6e 74 65 6e  ither the conten
26e0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  t of the page is
26f0: 0a 2a 2a 20 20 20 20 20 75 6e 63 68 61 6e 67 65  .**     unchange
2700: 64 20 6f 72 20 65 6c 73 65 20 74 68 65 20 63 6f  d or else the co
2710: 6e 74 65 6e 74 20 69 73 20 75 6e 69 6d 70 6f 72  ntent is unimpor
2720: 74 61 6e 74 20 61 6e 64 20 77 65 20 64 6f 20 6e  tant and we do n
2730: 6f 74 0a 2a 2a 20 20 20 20 20 63 61 72 65 20 77  ot.**     care w
2740: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74  hether or not it
2750: 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
2760: 2a 0a 2a 2a 20 61 6c 77 61 79 73 52 6f 6c 6c 62  *.** alwaysRollb
2770: 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ack.**.**     Th
2780: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
2790: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
27a0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
27b0: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20   should be.**   
27c0: 20 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 74 68    ignored for th
27d0: 69 73 20 70 61 67 65 2e 20 20 54 68 65 20 44 6f  is page.  The Do
27e0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
27f0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 73 61 79   attempts to say
2800: 0a 2a 2a 20 20 20 20 20 74 68 61 74 20 74 68 65  .**     that the
2810: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2820: 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  page on disk is 
2830: 75 6e 69 6d 70 6f 72 74 61 6e 74 20 28 69 74 20  unimportant (it 
2840: 69 73 20 61 6e 0a 2a 2a 20 20 20 20 20 75 6e 75  is an.**     unu
2850: 73 65 64 20 70 61 67 65 20 6f 6e 20 74 68 65 20  sed page on the 
2860: 66 72 65 65 6c 69 73 74 29 20 73 6f 20 74 68 61  freelist) so tha
2870: 74 20 69 74 20 69 73 20 75 6e 6e 65 63 65 73 73  t it is unnecess
2880: 61 72 79 20 74 6f 20 0a 2a 2a 20 20 20 20 20 72  ary to .**     r
2890: 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 20  ollback changes 
28a0: 74 6f 20 74 68 69 73 20 70 61 67 65 20 62 65 63  to this page bec
28b0: 61 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ause the content
28c0: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   of the page.** 
28d0: 20 20 20 20 63 61 6e 20 63 68 61 6e 67 65 20 77      can change w
28e0: 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
28f0: 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  the meaning of t
2900: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2910: 69 73 0a 2a 2a 20 20 20 20 20 66 6c 61 67 20 6f  is.**     flag o
2920: 76 65 72 72 69 64 65 73 20 61 6e 79 20 44 6f 6e  verrides any Don
2930: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 61 74 74 65  tRollback() atte
2940: 6d 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  mpt.  This flag 
2950: 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 77 68  is set.**     wh
2960: 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 6f  en a page that o
2970: 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69  riginally contai
2980: 6e 65 64 20 76 61 6c 69 64 20 64 61 74 61 20 69  ned valid data i
2990: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20  s added to.**   
29a0: 20 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20    the freelist. 
29b0: 20 4c 61 74 65 72 20 69 6e 20 74 68 65 20 73 61   Later in the sa
29c0: 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  me transaction, 
29d0: 74 68 69 73 20 70 61 67 65 20 6d 69 67 68 74 0a  this page might.
29e0: 2a 2a 20 20 20 20 20 62 65 20 70 75 6c 6c 65 64  **     be pulled
29f0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
2a00: 73 74 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  st and reused fo
2a10: 72 20 73 6f 6d 65 74 68 69 6e 67 20 64 69 66 66  r something diff
2a20: 65 72 65 6e 74 0a 2a 2a 20 20 20 20 20 61 6e 64  erent.**     and
2a30: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 74   at that point t
2a40: 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  he DontRollback(
2a50: 29 20 41 50 49 20 77 69 6c 6c 20 62 65 20 63 61  ) API will be ca
2a60: 6c 6c 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  lled because.** 
2a70: 20 20 20 20 70 61 67 65 73 20 74 61 6b 65 6e 20      pages taken 
2a80: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
2a90: 74 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  t do not need to
2aa0: 20 62 65 20 70 72 6f 74 65 63 74 65 64 20 62 79   be protected by
2ab0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 6f 6c 6c  .**     the roll
2ac0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 42  back journal.  B
2ad0: 75 74 20 74 68 69 73 20 66 6c 61 67 20 73 61 79  ut this flag say
2ae0: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2af0: 77 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 6f  was.**     not o
2b00: 72 69 67 69 6e 61 6c 6c 79 20 70 61 72 74 20 6f  riginally part o
2b10: 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73  f the freelist s
2b20: 6f 20 74 68 61 74 20 69 74 20 73 74 69 6c 6c 20  o that it still 
2b30: 6e 65 65 64 73 20 74 6f 0a 2a 2a 20 20 20 20 20  needs to.**     
2b40: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  be rolled back i
2b50: 6e 20 73 70 69 74 65 20 6f 66 20 61 6e 79 20 73  n spite of any s
2b60: 75 62 73 65 71 75 65 6e 74 20 44 6f 6e 74 52 6f  ubsequent DontRo
2b70: 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 73 2e 0a  llback() calls..
2b80: 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65 61 64 20 0a  **.** needRead .
2b90: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66  **.**     This f
2ba0: 6c 61 67 20 6d 65 61 6e 73 20 28 77 68 65 6e 20  lag means (when 
2bb0: 74 72 75 65 29 20 74 68 61 74 20 74 68 65 20 63  true) that the c
2bc0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2bd0: 67 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 6e 6f  ge has.**     no
2be0: 74 20 79 65 74 20 62 65 65 6e 20 6c 6f 61 64 65  t yet been loade
2bf0: 64 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 54 68  d from disk.  Th
2c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74  e in-memory cont
2c10: 65 6e 74 20 69 73 20 6a 75 73 74 0a 2a 2a 20 20  ent is just.**  
2c20: 20 20 20 67 61 72 62 61 67 65 2e 20 20 28 41 63     garbage.  (Ac
2c30: 74 75 61 6c 6c 79 2c 20 77 65 20 7a 65 72 6f 20  tually, we zero 
2c40: 74 68 65 20 63 6f 6e 74 65 6e 74 2c 20 62 75 74  the content, but
2c50: 20 79 6f 75 20 73 68 6f 75 6c 64 20 6e 6f 74 0a   you should not.
2c60: 2a 2a 20 20 20 20 20 6d 61 6b 65 20 61 6e 79 20  **     make any 
2c70: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
2c80: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6e 65  t the content ne
2c90: 76 65 72 74 68 65 6c 65 73 73 2e 29 20 20 49 66  vertheless.)  If
2ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74   the.**     cont
2cb0: 65 6e 74 20 69 73 20 6e 65 65 64 65 64 20 69 6e  ent is needed in
2cc0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 69 74 20   the future, it 
2cd0: 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 20 66  should be read f
2ce0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 6f  rom the.**     o
2cf0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
2d00: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   file..*/.struct
2d10: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
2d20: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
2d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d40: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
2d50: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
2d60: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d90: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
2da0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
2db0: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
2dc0: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
2dd0: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
2de0: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
2df0: 6f 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c  o */.  PagerLruL
2e00: 69 6e 6b 20 66 72 65 65 3b 20 20 20 20 20 20 20  ink free;       
2e10: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 6e        /* Next an
2e20: 64 20 70 72 65 76 69 6f 75 73 20 66 72 65 65 20  d previous free 
2e30: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2e40: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
2e60: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
2e70: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
2e80: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2e90: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
2ea0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2eb0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2ec0: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
2ef0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
2f00: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
2f10: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f30: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
2f40: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
2f50: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
2f60: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
2f80: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
2f90: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
2fa0: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65  e */.  u8 needRe
2fb0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2fc0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f        /* Read co
2fd0: 6e 74 65 6e 74 20 69 66 20 50 61 67 65 72 57 72  ntent if PagerWr
2fe0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
2ff0: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
3000: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3020: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
3030: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
3040: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
3050: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
3060: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
3070: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
3080: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
3090: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
30a0: 67 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  gfree;          
30b0: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 6c 69 73 74    /* Global list
30c0: 20 6f 66 20 6e 52 65 66 3d 3d 30 20 70 61 67 65   of nRef==0 page
30d0: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  s */.#endif.#ifd
30e0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
30f0: 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65  PAGES.  u32 page
3100: 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 76  Hash;.#endif.  v
3110: 6f 69 64 20 2a 70 44 61 74 61 3b 20 20 20 20 20  oid *pData;     
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3130: 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   Page data */.  
3140: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
3150: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
3160: 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
3170: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 7d  this header */.}
3180: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
3190: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
31a0: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
31b0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
31c0: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
31d0: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
31e0: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
31f0: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
3200: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
3210: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
3220: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
3230: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
3240: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
3250: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
3260: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
3270: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
3280: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
3290: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
32a0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
32b0: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
32c0: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
32d0: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
32e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
32f0: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
3300: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
3310: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
3320: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
3330: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
3340: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
3350: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
3360: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
3370: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
3380: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
3390: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
33a0: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
33b0: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
33c0: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
33d0: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
33e0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
33f0: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
3400: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
3410: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
3420: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
3430: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
3440: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
3450: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
3460: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
3470: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
3480: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
3490: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74    PgHdr *pNextSt
34a0: 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20  mt, *pPrevStmt; 
34b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
34c0: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
34d0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
34e0: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3500: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
3510: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3520: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
3530: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
3540: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
3550: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
3560: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
3570: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
3580: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
3590: 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50  1(P,D,N,X) if( P
35a0: 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20 50  ->xCodec!=0 ){ P
35b0: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
35c0: 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a  ecArg,D,N,X); }.
35d0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
35e0: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
35f0: 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50  )(P->xCodec!=0?P
3600: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
3610: 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29  ecArg,D,N,X):D))
3620: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3630: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
3640: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
3650: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
3660: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29 0a  N,X) ((char*)D).
3670: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
3680: 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20  nvert a pointer 
3690: 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20  to a PgHdr into 
36a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73  a pointer to its
36b0: 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63   data.** and bac
36c0: 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66  k again..*/.#def
36d0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ine PGHDR_TO_DAT
36e0: 41 28 50 29 20 20 20 20 28 28 50 29 2d 3e 70 44  A(P)    ((P)->pD
36f0: 61 74 61 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ata).#define PGH
3700: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
3710: 20 28 28 76 6f 69 64 2a 29 26 28 28 47 29 5b 31   ((void*)&((G)[1
3720: 5d 29 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  ])).#define PGHD
3730: 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29  R_TO_HIST(P,PGR)
3740: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20    \.            
3750: 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28  ((PgHistory*)&((
3760: 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29  char*)(&(P)[1]))
3770: 5b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29  [(PGR)->nExtra])
3780: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
3790: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
37a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
37b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
37c0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
37d0: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
37e0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
37f0: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
3800: 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51  UPT, or.** or SQ
3810: 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20  LITE_FULL. Once 
3820: 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  one of the first
3830: 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63   three errors oc
3840: 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74  curs, it persist
3850: 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75  s.** and is retu
3860: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
3870: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
3880: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
3890: 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
38a0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
38b0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
38c0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
38d0: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
38e0: 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63  the.** next succ
38f0: 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20  essful rollback 
3900: 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20  is performed on 
3910: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
3920: 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45   Also,.** SQLITE
3930: 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61  _FULL does not a
3940: 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65  ffect the sqlite
3950: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
3960: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
3970: 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68  up().** APIs, th
3980: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
3990: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
39a0: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67  y..*/.struct Pag
39b0: 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er {.  sqlite3_v
39c0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20  fs *pVfs;       
39d0: 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f     /* OS functio
39e0: 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f  ns to use for IO
39f0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3a00: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
3a10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
3a20: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
3a30: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
3a40: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
3a50: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
3a60: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
3a70: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
3a80: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
3a90: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
3aa0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
3ab0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
3ac0: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
3ad0: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
3ae0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
3af0: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
3b00: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
3b10: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
3b20: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3b40: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3b50: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
3b60: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
3b70: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
3b80: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
3b90: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
3ba0: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
3bb0: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
3bc0: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
3bd0: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
3be0: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
3bf0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
3c00: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
3c30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
3c40: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
3c50: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
3c60: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
3c70: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
3c80: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
3c90: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
3ca0: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
3cb0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
3cc0: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
3cd0: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
3ce0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3d00: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3d10: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3d20: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
3d30: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3d40: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3d50: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3d60: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3d70: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3d90: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3da0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3db0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3dd0: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3de0: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3df0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3e00: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
3e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3e20: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
3e30: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
3e40: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
3e50: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
3e60: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
3e70: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
3e80: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
3e90: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
3ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3eb0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
3ec0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
3ed0: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
3ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ef0: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
3f00: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
3f10: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
3f20: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
3f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3f40: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
3f50: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
3f60: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
3f70: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
3f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3f90: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
3fa0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3fb0: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68  USIVE */.  u8 ch
3fc0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
3fd0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
3fe0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
3ff0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
4000: 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  ter */.  u32 vfs
4010: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
4020: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
4030: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
4040: 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65  pen() */.  int e
4050: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
4060: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
4070: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
4080: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
4090: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
40a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
40b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
40c0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
40d0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
40e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
40f0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
4100: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
4110: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4130: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
4140: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
4150: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
4160: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4180: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
4190: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
41a0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
41b0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
41c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
41d0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
41e0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
41f0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
4200: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
4210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4220: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
4230: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
4240: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
4250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4260: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
4270: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
4280: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
4290: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
42a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
42b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
42c0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
42d0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42f0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
4300: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
4310: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4330: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4340: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
4350: 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e  with PgHdr.nRef>
4360: 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67  0 */.  int mxPag
4370: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4380: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
4390: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
43a0: 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a   hold in cache *
43b0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
43e0: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
43f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
4400: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
4410: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
4420: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
4430: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4440: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
4450: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
4460: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
4470: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
4480: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
4490: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
44a0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
44b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
44c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
44d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
44e0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
44f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
4500: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
4510: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
4520: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
4530: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
4540: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4550: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63  nal files */.  c
4560: 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 20  har *zStmtJrnl; 
4570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4580: 6d 65 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  me of the statem
4590: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
45a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
45b0: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
45c0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
45d0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
45e0: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
45f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
4600: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
4610: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
4620: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
4630: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
4640: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
4650: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
4660: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
4670: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
4680: 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c 69   */.  PagerLruLi
4690: 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20 20 20  st lru;         
46a0: 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f 66    /* LRU list of
46b0: 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20   free pages */. 
46c0: 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20   PgHdr *pAll;   
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46e0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  List of all page
46f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53  s */.  PgHdr *pS
4700: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
4710: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61     /* List of pa
4720: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
4730: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
4740: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
4750: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
4760: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
4770: 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20  dirty pages */. 
4780: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47a0: 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66  Current byte off
47b0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
47c0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
47d0: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
47e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
47f0: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
4800: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
4810: 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  er */.  i64 stmt
4820: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
4830: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75      /* First jou
4840: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
4850: 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  ten this stateme
4860: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  nt */.  i64 stmt
4870: 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  Cksum;          
4880: 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74      /* cksumInit
4890: 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20   when statement 
48a0: 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  was started */. 
48b0: 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20   i64 stmtJSize; 
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48d0: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
48e0: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
48f0: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
4900: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4910: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
4920: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
4930: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65  ollback */.#ifde
4940: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
4950: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
4960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4970: 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69  ache hits and mi
4980: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  ssing */.  int n
4990: 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20  Read, nWrite;   
49a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
49b0: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
49c0: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
49d0: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75    void (*xDestru
49e0: 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  ctor)(DbPage*,in
49f0: 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  t); /* Call this
4a00: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72   routine when fr
4a10: 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  eeing pages */. 
4a20: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
4a30: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
4a40: 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20     /* Call this 
4a50: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
4a60: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
4a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
4a80: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
4a90: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
4aa0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
4ab0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
4ac0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
4ad0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
4ae0: 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  ecArg;          
4af0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
4b00: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20  ent to xCodec() 
4b10: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  */.#endif.  int 
4b20: 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  nHash;          
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4b40: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
4b50: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48  h table */.  PgH
4b60: 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20  dr **aHash;     
4b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
4b80: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
4b90: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
4ba0: 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  dr */.#ifdef SQL
4bb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
4bc0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
4bd0: 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ager *pNext;    
4be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
4bf0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69 73 74  ubly linked list
4c00: 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20 77 68   of pagers on wh
4c10: 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  ich */.  Pager *
4c20: 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  pPrev;          
4c30: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
4c40: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
4c50: 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20   will work */.  
4c60: 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20  int iInUseMM;   
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4c80: 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61 76 61  on-zero if unava
4c90: 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a  ilable to MM */.
4ca0: 20 20 69 6e 74 20 69 49 6e 55 73 65 44 42 3b 20    int iInUseDB; 
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cc0: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 6e 20   Non-zero if in 
4cd0: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
4ce0: 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65 6e 64  memory() */.#end
4cf0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
4d00: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
4d10: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
4d20: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
4d30: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
4d40: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
4d50: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
4d60: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
4d70: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
4d80: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a   changes */.};..
4d90: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4da0: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
4db0: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
4dc0: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
4dd0: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
4de0: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
4df0: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
4e00: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
4e10: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
4e20: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4e30: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
4e40: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
4e50: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
4e60: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
4e70: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
4e80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4e90: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
4ea0: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
4eb0: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
4ec0: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
4ed0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
4ee0: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
4ef0: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
4f00: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
4f10: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
4f20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
4f30: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
4f40: 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71  ournal */.int sq
4f50: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
4f60: 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ee_count = 0;   
4f70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61   /* Number of ca
4f80: 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64 20  che pages freed 
4f90: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
4fa0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
4fb0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
4fc0: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
4fd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
4fe0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
4ff0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 68   points to the h
5000: 65 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65 2d  ead of a double-
5010: 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20 6f  linked list.** o
5020: 66 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68 61  f all pagers tha
5030: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
5040: 6f 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e 67  or page stealing
5050: 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   by the.** sqlit
5060: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
5070: 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20 20  y() interface.  
5080: 41 63 63 65 73 73 20 74 6f 20 74 68 69 73 20 6c  Access to this l
5090: 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65 63  ist is.** protec
50a0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
50b0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
50c0: 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69  EM2 mutex..*/.#i
50d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
50e0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
50f0: 4d 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67 65  MENT.static Page
5100: 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  r *sqlite3PagerL
5110: 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ist = 0;.static 
5120: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71 6c  PagerLruList sql
5130: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 20  ite3LruPageList 
5140: 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e  = {0, 0, 0};.#en
5150: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  dif.../*.** Jour
5160: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
5170: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
5180: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
5190: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
51a0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
51b0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
51c0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
51d0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
51e0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
51f0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
5200: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
5210: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
5220: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
5230: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
5240: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
5250: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
5260: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
5270: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
5280: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
5290: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
52a0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
52b0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
52c0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
52d0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
52e0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
52f0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
5300: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
5310: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
5320: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
5330: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
5340: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
5350: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
5360: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
5370: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
5380: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
5390: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
53a0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
53b0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
53c0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
53d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
53e0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
53f0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
5400: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
5410: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
5420: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
5430: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
5440: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
5450: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
5460: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
5470: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
5480: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
5490: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
54a0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
54b0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
54c0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
54d0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
54e0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
54f0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
5500: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
5510: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
5520: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
5530: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
5540: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5550: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5560: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5570: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5580: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5590: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
55a0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
55b0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
55c0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
55d0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
55e0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
55f0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
5600: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
5610: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
5620: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
5630: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
5640: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5650: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5660: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5670: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5680: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5690: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
56a0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
56b0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
56c0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
56d0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
56e0: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
56f0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
5700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5710: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
5720: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
5730: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
5740: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
5750: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
5760: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
5770: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
5780: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
5790: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
57a0: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
57b0: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
57c0: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
57d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
57e0: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
57f0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
5800: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
5810: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
5820: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
5830: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
5840: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5850: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5860: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
5870: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
5880: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
5890: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
58a0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
58b0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
58c0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
58d0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
58e0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
58f0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
5900: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
5910: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
5920: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
5930: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
5940: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
5950: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
5960: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
5970: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
5980: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5990: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
59a0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
59b0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
59c0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
59d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61  #endif../*.** Pa
59e0: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
59f0: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
5a00: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
5a10: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
5a20: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
5a30: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
5a40: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
5a50: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
5a60: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
5a70: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
5a80: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
5a90: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
5aa0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5ab0: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
5ac0: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
5ad0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5ae0: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
5af0: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
5b00: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
5b10: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
5b20: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
5b30: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5b40: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
5b50: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5b60: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
5b70: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
5b80: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
5b90: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5ba0: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
5bb0: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5bc0: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
5bd0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
5be0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
5bf0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
5c00: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
5c10: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
5c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  ./*.** The pager
5c30: 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67 65  Enter() and page
5c40: 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65  rLeave() routine
5c50: 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72 65  s acquire and re
5c60: 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78  lease.** a mutex
5c70: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20   on each pager. 
5c80: 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72 65   The mutex is re
5c90: 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  cursive..**.** T
5ca0: 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c  his is a special
5cb0: 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20  -purpose mutex. 
5cc0: 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65   It only provide
5cd0: 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  s mutual exclusi
5ce0: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  on.** between th
5cf0: 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65 20  e Btree and the 
5d00: 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e  Memory Managemen
5d10: 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  t sqlite3_releas
5d20: 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75  e_memory().** fu
5d30: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73  nction.  It does
5d40: 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f   not prevent, fo
5d50: 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42  r example, two B
5d60: 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73  trees from acces
5d70: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65  sing.** the same
5d80: 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73 61   pager at the sa
5d90: 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20  me time.  Other 
5da0: 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
5db0: 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68  mutexes in.** th
5dc0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68 61  e btree layer ha
5dd0: 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e  ndle that chore.
5de0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5df0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
5e00: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61  MANAGEMENT.  sta
5e10: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e  tic void pagerEn
5e20: 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ter(Pager *p){. 
5e30: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b     p->iInUseDB++
5e40: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e  ;.    if( p->iIn
5e50: 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55  UseMM && p->iInU
5e60: 73 65 44 42 3d 3d 31 20 29 7b 0a 20 20 20 20 20  seDB==1 ){.     
5e70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
5e80: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74  mutex;.      mut
5e90: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
5ea0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
5eb0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5ec0: 32 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  2);.      p->iIn
5ed0: 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20  UseDB = 0;.     
5ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5ef0: 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
5f00: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d     p->iInUseDB =
5f10: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
5f20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
5f30: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
5f40: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
5f50: 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eMM==0 );.  }.  
5f60: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5f70: 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29  rLeave(Pager *p)
5f80: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
5f90: 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B--;.    assert(
5fa0: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20   p->iInUseDB>=0 
5fb0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64  );.  }.#else.# d
5fc0: 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72  efine pagerEnter
5fd0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67  (X).# define pag
5fe0: 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  erLeave(X).#endi
5ff0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  f../*.** Enable 
6000: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
6010: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
6020: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
6030: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6040: 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65  DEBUG.  int page
6050: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
6060: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
6070: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
6080: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
6090: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
60a0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
60b0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
60c0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
60d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
60e0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
60f0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
6100: 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74  %p nRef=%-3d tot
6110: 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
6120: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
6130: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
6140: 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e  Ref, p->pPager->
6150: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
6160: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
6170: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
6180: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
6190: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
61a0: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
61b0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
61c0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
61d0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
61e0: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
61f0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6200: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e   linked list man
6210: 61 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72  aged by structur
6220: 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20  e.** pList (pPg 
6230: 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74  becomes the last
6240: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69   entry in the li
6250: 73 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65  st - the most re
6260: 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29  cently .** used)
6270: 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b  . Argument pLink
6280: 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f   should point to
6290: 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65   either pPg->fre
62a0: 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c  e or pPg->gfree,
62b0: 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .** depending on
62c0: 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20   whether pPg is 
62d0: 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
62e0: 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69  he pager-specifi
62f0: 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c  c or.** global L
6300: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
6310: 69 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28  ic void listAdd(
6320: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c  PagerLruList *pL
6330: 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e  ist, PagerLruLin
6340: 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20  k *pLink, PgHdr 
6350: 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e  *pPg){.  pLink->
6360: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69  pNext = 0;.  pLi
6370: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73  nk->pPrev = pLis
6380: 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65  t->pLast;..#ifde
6390: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
63a0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
63b0: 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  T.  assert(pLink
63c0: 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20  ==&pPg->free || 
63d0: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72  pLink==&pPg->gfr
63e0: 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  ee);.  assert(pL
63f0: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65  ink==&pPg->gfree
6400: 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69   || pList!=&sqli
6410: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b  te3LruPageList);
6420: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
6430: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
6440: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63     int iOff = (c
6450: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
6460: 68 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50  har *)pPg;.    P
6470: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61  agerLruLink *pLa
6480: 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  stLink = (PagerL
6490: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
64a0: 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b  *)pList->pLast)[
64b0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73  iOff]);.    pLas
64c0: 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  tLink->pNext = p
64d0: 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  Pg;.  }else{.   
64e0: 20 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e   assert(!pList->
64f0: 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69  pFirst);.    pLi
6500: 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  st->pFirst = pPg
6510: 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e  ;.  }..  pList->
6520: 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69  pLast = pPg;.  i
6530: 66 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  f( !pList->pFirs
6540: 74 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e  tSynced && pPg->
6550: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20  needSync==0 ){. 
6560: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6570: 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
6580: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
6590: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
65a0: 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74  ist managed by t
65b0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
65c0: 6e 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74  nted to by pList
65d0: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
65e0: 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f   pLink should po
65f0: 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50  int to either pP
6600: 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e  g->free or pPg->
6610: 67 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67  gfree, depending
6620: 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20   .** on whether 
6630: 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64  pPg is being add
6640: 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d  ed to the pager-
6650: 73 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62  specific or glob
6660: 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a  al LRU list..*/.
6670: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74  static void list
6680: 52 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c  Remove(PagerLruL
6690: 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65  ist *pList, Page
66a0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c  rLruLink *pLink,
66b0: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
66c0: 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72  int iOff = (char
66d0: 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72   *)pLink - (char
66e0: 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20   *)pPg;..#ifdef 
66f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
6700: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
6710: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6720: 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c  &pPg->free || pL
6730: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65  ink==&pPg->gfree
6740: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  );.  assert(pLin
6750: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c  k==&pPg->gfree |
6760: 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65  | pList!=&sqlite
6770: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23  3LruPageList);.#
6780: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67  endif..  if( pPg
6790: 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20  ==pList->pFirst 
67a0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46  ){.    pList->pF
67b0: 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e  irst = pLink->pN
67c0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
67d0: 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74  Pg==pList->pLast
67e0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70   ){.    pList->p
67f0: 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50  Last = pLink->pP
6800: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
6810: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Link->pPrev ){. 
6820: 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20     PagerLruLink 
6830: 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61  *pPrevLink = (Pa
6840: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28  gerLruLink *)(&(
6850: 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72  (u8 *)pLink->pPr
6860: 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ev)[iOff]);.    
6870: 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74  pPrevLink->pNext
6880: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6890: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
68a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50  ->pNext ){.    P
68b0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65  agerLruLink *pNe
68c0: 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  xtLink = (PagerL
68d0: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
68e0: 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b  *)pLink->pNext)[
68f0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78  iOff]);.    pNex
6900: 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  tLink->pPrev = p
6910: 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  Link->pPrev;.  }
6920: 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73  .  if( pPg==pLis
6930: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6940: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
6950: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
6960: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
6970: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  p->needSync ){. 
6980: 20 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e       PagerLruLin
6990: 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72  k *pL = (PagerLr
69a0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
69b0: 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  )p)[iOff]);.    
69c0: 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b    p = pL->pNext;
69d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
69e0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
69f0: 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b   p;.  }..  pLink
6a00: 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d  ->pNext = pLink-
6a10: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f  >pPrev = 0;.}../
6a20: 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70  * .** Add page p
6a30: 50 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  Pg to the list o
6a40: 66 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72  f free pages for
6a50: 20 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a   the pager. If .
6a60: 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  ** memory-manage
6a70: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6a80: 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61   also add the pa
6a90: 67 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ge to the global
6aa0: 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65   .** list of fre
6ab0: 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  e pages..*/.stat
6ac0: 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41  ic void lruListA
6ad0: 64 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  dd(PgHdr *pPg){.
6ae0: 20 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e    listAdd(&pPg->
6af0: 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50  pPager->lru, &pP
6b00: 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23  g->free, pPg);.#
6b10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b20: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6b30: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67  EMENT.  if( !pPg
6b40: 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
6b50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
6b60: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
6b70: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6b80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6b90: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69  IC_LRU));.    li
6ba0: 73 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72  stAdd(&sqlite3Lr
6bb0: 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d  uPageList, &pPg-
6bc0: 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20  >gfree, pPg);.  
6bd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6be0: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
6bf0: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6c00: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6c10: 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  U));.  }.#endif.
6c20: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65  }../* .** Remove
6c30: 20 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74   page pPg from t
6c40: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6c50: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73  pages for the as
6c60: 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a  sociated pager..
6c70: 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  ** If memory-man
6c80: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6c90: 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20  ed, also remove 
6ca0: 70 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f  pPg from the glo
6cb0: 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66  bal list.** of f
6cc0: 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  ree pages..*/.st
6cd0: 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73  atic void lruLis
6ce0: 74 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70  tRemove(PgHdr *p
6cf0: 50 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76  Pg){.  listRemov
6d00: 65 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  e(&pPg->pPager->
6d10: 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c  lru, &pPg->free,
6d20: 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51   pPg);.#ifdef SQ
6d30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6d40: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6d50: 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72  if( !pPg->pPager
6d60: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73  ->memDb ){.    s
6d70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6d80: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
6d90: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6da0: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6db0: 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65  ;.    listRemove
6dc0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
6dd0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
6de0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
6df0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6e00: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6e10: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6e20: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6e30: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6e40: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
6e50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  on is called jus
6e60: 74 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64  t after the need
6e70: 53 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65  Sync flag has be
6e80: 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72  en cleared.** fr
6e90: 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e  om all pages man
6ea0: 61 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28  aged by pPager (
6eb0: 75 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20  usually because 
6ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6ed0: 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65  .** has just bee
6ee0: 6e 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70  n synced). It up
6ef0: 64 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72  dates the pPager
6f00: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6f10: 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61  ed variable.** a
6f20: 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  nd, if memory-ma
6f30: 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
6f40: 6c 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33  led, the sqlite3
6f50: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6f60: 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69  stSynced.** vari
6f70: 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74  able also..*/.st
6f80: 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73  atic void lruLis
6f90: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
6fa0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6fb0: 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46    pPager->lru.pF
6fc0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
6fd0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b  ger->lru.pFirst;
6fe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6ff0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
7000: 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  AGEMENT.  if( !p
7010: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
7020: 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
7030: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7040: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
7050: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
7060: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
7070: 55 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73  U));.    for(p=s
7080: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
7090: 74 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70  t.pFirst; p && p
70a0: 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d  ->needSync; p=p-
70b0: 3e 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20  >gfree.pNext);. 
70c0: 20 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61     assert(p==pPa
70d0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
70e0: 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69  ynced || p==sqli
70f0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
7100: 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20  FirstSynced);.  
7110: 20 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65    sqlite3LruPage
7120: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
7130: 64 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74  d = p;.    sqlit
7140: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
7150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
7160: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7170: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
7180: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
7190: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
71a0: 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61   page *pPg has a
71b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
71c0: 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65  ten to the state
71d0: 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ment.** journal 
71e0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e  (or statement sn
71f0: 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20  apshot has been 
7200: 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67  created, if *pPg
7210: 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61   is part.** of a
7220: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
7230: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
7240: 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65   int pageInState
7250: 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  ment(PgHdr *pPg)
7260: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
7270: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
7280: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
7290: 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52      return PGHDR
72a0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
72b0: 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20  ager)->inStmt;. 
72c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
72d0: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
72e0: 6f 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  o;.    u8 *a = p
72f0: 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a  Pager->aInStmt;.
7300: 20 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26      return (a &&
7310: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
7320: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20  er->stmtSize && 
7330: 28 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  (a[pgno/8] & (1<
7340: 3c 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20  <(pgno&7))));.  
7350: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7360: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7370: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
7380: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
7390: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
73a0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
73b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
73c0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
73d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
73e0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
73f0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
7400: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
7410: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70  (N-1))==0 );.  p
7420: 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
7430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  );.  sqlite3Mall
7440: 6f 63 42 65 6e 69 67 6e 46 61 69 6c 75 72 65 28  ocBenignFailure(
7450: 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 61 48 61  (int)pPager->aHa
7460: 73 68 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73  sh);.  aHash = s
7470: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
7480: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
7490: 5d 29 2a 4e 20 29 3b 0a 20 20 70 61 67 65 72 45  ])*N );.  pagerE
74a0: 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
74b0: 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a  if( aHash==0 ){.
74c0: 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
74d0: 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20  o rehash is not 
74e0: 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73  an error.  It is
74f0: 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61   only a performa
7500: 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20  nce hit. */.    
7510: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
7520: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
7530: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
7540: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
7550: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
7560: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
7570: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7580: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
7590: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
75a0: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
75b0: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
75c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
75d0: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
75e0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
75f0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
7600: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
7610: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
7620: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
7630: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
7640: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
7650: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
7660: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
7670: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
7680: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
7690: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
76a0: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
76b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
76c0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
76d0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
76e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
76f0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
7700: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
7710: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
7720: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
7730: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
7740: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
7750: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
7760: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7770: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
7780: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
7790: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
77a0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
77b0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
77c0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
77d0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
77e0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
77f0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
7800: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
7810: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
7820: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
7830: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
7840: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
7850: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
7860: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
7870: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7880: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
7890: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
78a0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
78b0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
78c0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
78d0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
78e0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
78f0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
7900: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
7910: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
7920: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
7930: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7940: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7950: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
7960: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
7970: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7980: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
7990: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
79a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
79b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
79c0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
79d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
79e0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
79f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
7a00: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
7a10: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
7a20: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
7a30: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
7a40: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
7a50: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
7a60: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
7a70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
7a80: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
7a90: 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64  f( !pFd->pMethod
7aa0: 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
7ab0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
7ac0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
7ad0: 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f  sUnlock(pFd, eLo
7ae0: 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ck);.}../*.** Th
7af0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
7b00: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
7b10: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
7b20: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
7b30: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
7b40: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
7b50: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
7b60: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
7b70: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
7b80: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7b90: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
7ba0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
7bb0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
7bc0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
7bd0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
7be0: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
7bf0: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
7c00: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7c10: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
7c20: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
7c30: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
7c40: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
7c50: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7c60: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7c70: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
7c80: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
7c90: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
7ca0: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
7cb0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
7cc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
7cd0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
7ce0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
7cf0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
7d00: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
7d10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
7d20: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
7d30: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
7d40: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
7d50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7d60: 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20  .  int dc;      
7d70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
7d80: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
7d90: 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b  /.  int nSector;
7da0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
7db0: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  size */.  int nP
7dc0: 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  age;        /* P
7dd0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71  age size */.  sq
7de0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
7df0: 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20   pPager->fd;..  
7e00: 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
7e10: 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   ){.    dc = sql
7e20: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
7e30: 61 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b  acteristics(fd);
7e40: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73  .    nSector = s
7e50: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
7e60: 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67  ze(fd);.    nPag
7e70: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
7e80: 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Size;.  }..  ass
7e90: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
7ea0: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
7eb0: 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28  >>8));.  assert(
7ec0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7ed0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
7ee0: 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d  8));..  if( !fd-
7ef0: 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63  >pMethods || (dc
7f00: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
7f10: 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29  TOMIC|(nPage>>8)
7f20: 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67  )&&nSector<=nPag
7f30: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
7f40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
7f50: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
7f60: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
7f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7f80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7f90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
7fa0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7fb0: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
7fc0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
7fd0: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
7fe0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7ff0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
8000: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
8010: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
8020: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
8030: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
8040: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
8050: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
8060: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
8070: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
8080: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
8090: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
80a0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
80b0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
80c0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
80d0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
80e0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
80f0: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
8100: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
8110: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
8120: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
8130: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
8140: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
8150: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
8160: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
8170: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
8180: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
8190: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
81a0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
81b0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
81c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
81d0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
81e0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
81f0: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
8200: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
8210: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
8220: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
8230: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
8240: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
8250: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
8260: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
8270: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
8280: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  t error occured,
8290: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
82a0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
82b0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
82c0: 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  layed..*/.static
82d0: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
82e0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
82f0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  );.static int pa
8300: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
8310: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
8320: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
8330: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
8340: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
8350: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
8360: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
8370: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
8390: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
83a0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
83b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
83c0: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
83d0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
83e0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
83f0: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
8400: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
8410: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
8420: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
8430: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8440: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
8450: 4f 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  OCK && pPager->n
8460: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
8470: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8480: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
8490: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
84a0: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
84b0: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
84c0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
84d0: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
84e0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
84f0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
8500: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
8510: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
8520: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
8530: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8550: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
8560: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
8570: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
8580: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
8590: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
85a0: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
85b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
85c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
85d0: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
85e0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
85f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
8600: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
8610: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
8620: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
8630: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
8640: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8650: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
8660: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
8670: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
8680: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
8690: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
86a0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
86b0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
86c0: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
86d0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
86e0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
86f0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
8700: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
8710: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
8720: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
8730: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
8740: 7a 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ze, .           
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 6e               (un
8760: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
8770: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
8780: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  e));.}../*.** Th
8790: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
87a0: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
87b0: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
87c0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
87d0: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
87e0: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
87f0: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
8800: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
8810: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
8820: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
8830: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
8840: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
8850: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
8860: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
8870: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
8880: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
8890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
88a0: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
88b0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
88c0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
88d0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
88e0: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
88f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
8900: 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e  | MEMDB || pPg->
8910: 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20  dirty || .      
8920: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
8930: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
8940: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
8950: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
8960: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
8970: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
8980: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
8990: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
89a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
89b0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
89c0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
89d0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
89e0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
89f0: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
8a00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8a10: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
8a20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
8a30: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
8a40: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
8a50: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
8a60: 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a  caller. .**.** z
8a70: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
8a80: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
8a90: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
8aa0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
8ab0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
8ac0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
8ad0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
8ae0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
8af0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
8b00: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
8b10: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
8b20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8b30: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
8b40: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
8b50: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8b60: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
8b70: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
8b80: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
8b90: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
8ba0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
8bb0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
8bc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
8bd0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
8be0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
8bf0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
8c00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8c10: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
8c20: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
8c30: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
8c40: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
8c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8c60: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
8c70: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
8c80: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
8c90: 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65  ster, int nMaste
8ca0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
8cb0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
8cc0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
8cd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
8ce0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
8cf0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
8d00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
8d10: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
8d20: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8d30: 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ';..  rc = sqlit
8d40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
8d50: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
8d60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8d70: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
8d80: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
8d90: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
8da0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20  szJ-16, &len);. 
8db0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8dc0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8dd0: 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73  .  if( len>=nMas
8de0: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
8df0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8e00: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8e10: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8e20: 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  2, &cksum);.  if
8e30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8e40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8e50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8e60: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
8e70: 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69  , 8, szJ-8);.  i
8e80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8e90: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
8ea0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
8eb0: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
8ec0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
8ed0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
8ee0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
8ef0: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
8f00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8f20: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
8f30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a  n] = '\0';..  /*
8f40: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
8f50: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
8f60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8f70: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
8f80: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8f90: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
8fa0: 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20  ster[i];.   }.  
8fb0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
8fc0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
8fd0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
8fe0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
8ff0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
9000: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
9010: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
9020: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9030: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
9040: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
9050: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
9060: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
9070: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
9080: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
9090: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
90a0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
90b0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
90c0: 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d      zMaster[0] =
90d0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
90e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
90f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
9100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9110: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
9120: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
9130: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
9140: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
9150: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
9160: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
9170: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
9180: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
9190: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
91a0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
91b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
91c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
91d0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
91e0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
91f0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
9240: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
9260: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
9280: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
92a0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
92b0: 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e  c void seekJourn
92c0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
92d0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
92e0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
92f0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9300: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
9310: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
9320: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
9330: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
9340: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
9350: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
9360: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
9370: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9380: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
9390: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
93a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
93b0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
93c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
93d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
93e0: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
93f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9410: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9420: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9430: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
9440: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
9450: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
9460: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
9470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9480: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
9490: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
94a0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
94b0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
94c0: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
94d0: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
94e0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
94f0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
9500: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
9510: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
9520: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
9530: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
9540: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
9550: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
9560: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
9570: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
9580: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
9590: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
95a0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
95b0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
95c0: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
95d0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
95e0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
95f0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
9600: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
9610: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
9620: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
9630: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
9640: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
9650: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
9660: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
9670: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9680: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
9690: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
96a0: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
96b0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
96c0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
96d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
96e0: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
96f0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
9700: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9710: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9720: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
9730: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
9740: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9750: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9760: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
9770: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
9780: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
9790: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
97a0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
97b0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
97c0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
97d0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
97e0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
97f0: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
9800: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
9810: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
9820: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
9830: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
9840: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
9850: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
9860: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
9870: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
9880: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
9890: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
98a0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
98b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
98c0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
98d0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
98e0: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
98f0: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
9900: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
9910: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
9920: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
9930: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
9940: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
9950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9960: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
9970: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
9980: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
9990: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
99a0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
99b0: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
99c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
99d0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
99e0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
99f0: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
9a00: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
9a10: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
9a20: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
9a30: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
9a40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9a50: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
9a60: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
9a70: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
9a80: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
9a90: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
9aa0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
9ab0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
9ac0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
9ad0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
9ae0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
9af0: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
9b00: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
9b10: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
9b20: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
9b30: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9b40: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9b50: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
9b60: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
9b70: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
9b80: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
9b90: 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33   .   || (sqlite3
9ba0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9bb0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
9bc0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
9bd0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
9be0: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
9bf0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9c00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9c10: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
9c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
9c30: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9c40: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9c50: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
9c60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
9c70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
9c80: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
9c90: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
9ca0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
9cb0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
9cc0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
9cd0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9ce0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9cf0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
9d00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9d10: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
9d20: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
9d30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
9d40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9d50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9d60: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
9d70: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
9d80: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
9d90: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
9da0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
9db0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9dc0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9dd0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
9de0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54  ctorSize);.  IOT
9df0: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
9e00: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
9e10: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
9e20: 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48  alHdr, sizeof(zH
9e30: 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20  eader))).  rc = 
9e40: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9e50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
9e60: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
9e70: 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75  der),pPager->jou
9e80: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67  rnalOff);.  pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9ea0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9eb0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
9ec0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
9ed0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
9ee0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
9ef0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
9f00: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
9f10: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
9f20: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9f30: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
9f40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
9f50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9f60: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
9f70: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
9f80: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9f90: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
9fa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9fb0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9fc0: 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67   "\000", 1, pPag
9fd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
9fe0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9ff0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
a000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
a010: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
a020: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
a030: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
a040: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
a050: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
a060: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
a070: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
a080: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
a090: 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f  .** file. See co
a0a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
a0b0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
a0c0: 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65  alHdr() for a de
a0d0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
a0e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a0f0: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
a100: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
a110: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
a120: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
a130: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
a140: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
a150: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
a160: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
a170: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
a180: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
a190: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
a1a0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
a1b0: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
a1c0: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
a1d0: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
a1e0: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
a1f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
a200: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
a210: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
a220: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
a230: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
a240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a250: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
a260: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
a270: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
a280: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
a290: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
a2a0: 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20  e are not set.  
a2b0: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
a2c0: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
a2d0: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
a2e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a2f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
a300: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
a310: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
a320: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
a330: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34   *pPager, .  i64
a340: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20   journalSize,.  
a350: 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75  u32 *pNRec, .  u
a360: 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20  32 *pDbSize.){. 
a370: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
a380: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
a390: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
a3a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
a3b0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
a3c0: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65  4 jrnlOff;..  se
a3d0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
a3e0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a3f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
a400: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a410: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
a420: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
a430: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a440: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
a450: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a460: 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f;..  rc = sqlit
a470: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a480: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
a490: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72  zeof(aMagic), jr
a4a0: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
a4b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a4c0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f  jrnlOff += sizeo
a4d0: 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66  f(aMagic);..  if
a4e0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
a4f0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a500: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
a510: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a520: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a530: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
a540: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a550: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63  , jrnlOff, pNRec
a560: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a570: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a580: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a590: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a5a0: 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  +4, &pPager->cks
a5b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
a5c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a5d0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a5e0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a5f0: 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a  rnlOff+8, pDbSiz
a600: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
a610: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
a620: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
a630: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
a640: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
a650: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
a660: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
a670: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
a680: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
a690: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
a6a0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a6b0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
a6c0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
a6d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
a6e0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
a6f0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
a700: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
a710: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
a720: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a730: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a740: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a750: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a760: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
a770: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a780: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20  fd, jrnlOff+12, 
a790: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
a7a0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
a7b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a7c0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
a7d0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
a7e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a7f0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
a800: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
a810: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
a820: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
a830: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
a840: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
a850: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
a860: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
a870: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
a880: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a890: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
a8a0: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
a8b0: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
a8c0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
a8d0: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
a8e0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
a8f0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
a900: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
a910: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
a920: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
a930: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
a940: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
a950: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
a960: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
a970: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a980: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
a990: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
a9a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
a9b0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
a9c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
a9d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a9e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
a9f0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
aa00: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
aa10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aa20: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
aa30: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
aa40: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
aa50: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
aa60: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
aa70: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
aa80: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
aa90: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
aaa0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
aab0: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
aac0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
aad0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
aae0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
aaf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ab00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
ab10: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
ab20: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
ab30: 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c  t i; .  i64 jrnl
ab40: 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  Off;.  u32 cksum
ab50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
ab60: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
ab70: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
ab80: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
ab90: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
aba0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
abb0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
abc0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
abd0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
abe0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
abf0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
ac00: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
ac10: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
ac20: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
ac30: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
ac40: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
ac50: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
ac60: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
ac70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ac80: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
ac90: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
aca0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
acb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
acc0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
acd0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
ace0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
acf0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
ad00: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
ad10: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a  pPager);.  }.  j
ad20: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
ad30: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
ad40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ad50: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
ad60: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
ad70: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
ad80: 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d  jrnlOff, PAGER_M
ad90: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
ada0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
adb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
adc0: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34  ;.  jrnlOff += 4
add0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
ade0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
adf0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
ae00: 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  en, jrnlOff);.  
ae10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ae20: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
ae30: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b   jrnlOff += len;
ae40: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
ae50: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
ae60: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
ae70: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
ae80: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
ae90: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
aea0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
aeb0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
aec0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
aed0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
aee0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
aef0: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
af00: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
af10: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
af20: 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nc;.  return rc;
af30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
af40: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
af50: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
af60: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
af70: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
af80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
af90: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
afa0: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
afb0: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
afc0: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
afd0: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
afe0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
aff0: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
b000: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
b010: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
b020: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
b030: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
b040: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
b050: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
b060: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
b070: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
b080: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
b090: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
b0a0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
b0b0: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
b0c0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b0d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b0e0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b0f0: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
b100: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
b110: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
b120: 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b  assert( MEMDB );
b130: 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69  .  if( !pHist->i
b140: 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  nStmt ){.    ass
b150: 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65  ert( pHist->pPre
b160: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73  vStmt==0 && pHis
b170: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  t->pNextStmt==0 
b180: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b190: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
b1a0: 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28    PGHDR_TO_HIST(
b1b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70  pPager->pStmt, p
b1c0: 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d  Pager)->pPrevStm
b1d0: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
b1e0: 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53     pHist->pNextS
b1f0: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
b200: 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  tmt;.    pPager-
b210: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
b220: 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
b230: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
b240: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
b250: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
b260: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
b270: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
b280: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
b290: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
b2a0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
b2b0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
b2c0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
b2d0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
b2e0: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
b2f0: 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  p;.  if( pPager-
b300: 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75  >aHash==0 ) retu
b310: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67  rn 0;.  p = pPag
b320: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26  er->aHash[pgno &
b330: 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
b340: 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  1)];.  while( p 
b350: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
b360: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
b370: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
b380: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
b390: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d  ** Clear the in-
b3a0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
b3b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
b3c0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b3d0: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
b3e0: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
b3f0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
b400: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
b410: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
b420: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
b430: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
b440: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
b450: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
b460: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
b470: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
b480: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
b490: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
b4a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b4b0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
b4c0: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61  pNext;.  if( pPa
b4d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
b4e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67  eturn;.  for(pPg
b4f0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
b500: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
b510: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
b520: 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
b530: 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
b540: 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ));.    PAGER_IN
b550: 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
b560: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
b570: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
b580: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 6c  >pNextAll;.    l
b590: 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
b5a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b5b0: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
b5c0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b5d0: 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20  ru.pFirst==0);. 
b5e0: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b5f0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
b600: 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ==0);.  assert(p
b610: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74  Pager->lru.pLast
b620: 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ==0);.  pPager->
b630: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
b640: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
b650: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
b660: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b670: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
b680: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
b690: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
b6a0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
b6b0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
b6c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
b6d0: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
b6e0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
b6f0: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
b700: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
b710: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
b720: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
b730: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
b740: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
b750: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
b760: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
b770: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
b780: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
b790: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
b7a0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
b7b0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
b7c0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
b7d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
b7e0: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
b7f0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
b800: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
b810: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
b820: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
b830: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
b840: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b850: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
b860: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b870: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b880: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
b890: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
b8a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
b8b0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
b8c0: 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70        osUnlock(p
b8d0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
b8e0: 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
b8f0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
b900: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f  e = -1;.      IO
b910: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b920: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
b930: 20 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65        /* If Page
b940: 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
b950: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
b960: 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
b970: 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20  e cannot be.    
b980: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
b990: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
b9a0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b9b0: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
b9c0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
b9d0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
b9e0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
b9f0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
ba00: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
ba10: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
ba20: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
ba30: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
ba40: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
ba50: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67  _OK;.        pag
ba60: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
ba70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
ba80: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
ba90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
baa0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
bab0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20  r->stfd);.      
bac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bad0: 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
bae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
baf0: 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
bb00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb10: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
bb20: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
bb30: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bb40: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
bb50: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
bb60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bb70: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pen = 0;.       
bb80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bb90: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
bba0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  al);.          p
bbb0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
bbc0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  l = 0;.        }
bbd0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bbe0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
bbf0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
bc00: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
bc10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bc20: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
bc30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bc40: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
bc50: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
bc60: 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
bc70: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
bc80: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
bc90: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
bca0: 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
bcb0: 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  B || pPager->err
bcc0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bcd0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
bce0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
bcf0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61  NLOCK;.      pPa
bd00: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
bd10: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Done = 0;.    }.
bd20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
bd30: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
bd40: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
bd50: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
bd60: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
bd70: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
bd80: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
bd90: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
bda0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a  e error state, .
bdb0: 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** do not attemp
bdc0: 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  t the rollback..
bdd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bde0: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
bdf0: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b  lback(Pager *p){
be00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  .  assert( p->st
be10: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
be20: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
be30: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  lOpen==0 );.  if
be40: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
be50: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
be60: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
be70: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
be80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
be90: 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  p);.  }.  pager_
bea0: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73  unlock(p);.  ass
beb0: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
bec0: 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  || !p->journalOp
bed0: 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73  en || (p->exclus
bee0: 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75  iveMode&&!p->jou
bef0: 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73  rnalOff) );.  as
bf00: 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65  sert( p->errCode
bf10: 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e   || !p->stmtOpen
bf20: 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65   || p->exclusive
bf30: 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Mode );.}../*.**
bf40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bf50: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bf60: 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
bf70: 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74   is ended by eit
bf80: 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20  her.** a COMMIT 
bf90: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  or a ROLLBACK..*
bfa0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
bfb0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bfc0: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
bfd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bfe0: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
bff0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c000: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
c010: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c020: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
c030: 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74  lease.** the dat
c040: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
c050: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
c060: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
c070: 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a  ce if that is.**
c080: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
c090: 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52   thing to do.  R
c0a0: 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75  elease locks usu
c0b0: 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69  ally is appropri
c0c0: 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77  ate,.** unless w
c0d0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
c0e0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f  ve access mode o
c0f0: 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  r unless this is
c100: 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e   a .** COMMIT AN
c110: 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42  D BEGIN or ROLLB
c120: 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70  ACK AND BEGIN op
c130: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  eration..**.** T
c140: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c150: 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65  is either delete
c160: 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a  d or truncated..
c170: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
c180: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
c190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
c1a0: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
c1b0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
c1c0: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
c1d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
c1e0: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
c1f0: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
c200: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
c210: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
c220: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
c230: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c240: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c250: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
c260: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
c270: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c280: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
c290: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c2a0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c2b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
c2c0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
c2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2e0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
c2f0: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
c300: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
c310: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
c320: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
c330: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
c340: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c350: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
c360: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
c370: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
c380: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c390: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
c3a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
c3b0: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
c3c0: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
c3d0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
c3e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
c3f0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
c400: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c410: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c420: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c430: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c440: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c450: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c460: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
c470: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c480: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
c490: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c4a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c4b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
c4c0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
c4d0: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
c4e0: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
c4f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c500: 74 65 33 5f 66 72 65 65 28 20 70 50 61 67 65 72  te3_free( pPager
c510: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
c520: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
c530: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c540: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
c550: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
c560: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
c570: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
c580: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
c590: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
c5a0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
c5b0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  nc = 0;.      pP
c5c0: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
c5d0: 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  k = 0;.#ifdef SQ
c5e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c5f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
c600: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
c610: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
c620: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  if.    }.    pPa
c630: 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
c640: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
c650: 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
c660: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
c670: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
c680: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c690: 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
c6a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
c6b0: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
c6c0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73  =0 || pPager->us
c6d0: 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  eJournal==0 );. 
c6e0: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
c6f0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c700: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
c710: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
c720: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
c730: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
c740: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
c750: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
c760: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
c770: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
c780: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
c790: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
c7a0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
c7b0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
c7c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
c7d0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
c7e0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
c7f0: 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69  ;.  lruListSetFi
c800: 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
c810: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
c820: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74  ize = -1;..  ret
c830: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
c840: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
c850: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
c860: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
c870: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
c880: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
c890: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
c8a0: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
c8b0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
c8c0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
c8d0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
c8e0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
c8f0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
c900: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
c910: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
c920: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
c930: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
c940: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
c950: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
c960: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
c970: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
c980: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
c990: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
c9a0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
c9b0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
c9c0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
c9d0: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
c9e0: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
c9f0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
ca00: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
ca10: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
ca20: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
ca30: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
ca40: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
ca50: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
ca60: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
ca70: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
ca80: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
ca90: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
caa0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
cab0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
cac0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
cad0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
cae0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
caf0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
cb00: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
cb10: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
cb20: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
cb30: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
cb40: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
cb50: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
cb60: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
cb70: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
cb80: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
cb90: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
cba0: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
cbb0: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
cbc0: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
cbd0: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
cbe0: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
cbf0: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
cc00: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
cc10: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
cc20: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
cc30: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
cc40: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
cc50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
cc60: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cc70: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
cc80: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
cc90: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
cca0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
ccb0: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
ccc0: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
ccd0: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
cce0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
ccf0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
cd00: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
cd10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
cd20: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
cd30: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
cd40: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
cd50: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
cd60: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
cd70: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
cd80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
cd90: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
cda0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
cdb0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
cdc0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
cdd0: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
cde0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
cdf0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
ce00: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
ce10: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
ce20: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
ce30: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
ce40: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
ce50: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
ce60: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
ce70: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
ce80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
ce90: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
cea0: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
ceb0: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71  r *pPager, .  sq
cec0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c  lite3_file *jfd,
ced0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20  .  i64 offset,. 
cee0: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b   int useCksum.){
cef0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
cf00: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
cf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
cf20: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
cf30: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
cf40: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cf60: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
cf70: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
cf80: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
cf90: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
cfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
cfb0: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
cfc0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
cfd0: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
cfe0: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
cff0: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
d000: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
d010: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
d020: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
d030: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
d040: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
d050: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
d060: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d070: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
d080: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
d090: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
d0a0: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
d0b0: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
d0c0: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
d0d0: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
d0e0: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
d0f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
d100: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
d110: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
d120: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d130: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
d140: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
d150: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
d160: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
d170: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d180: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d190: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
d1a0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
d1b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
d1c0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
d1d0: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
d1e0: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
d1f0: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
d200: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
d210: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
d220: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
d230: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
d240: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
d250: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
d260: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
d270: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
d280: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
d290: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
d2a0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
d2b0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
d2c0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
d2d0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
d2e0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
d2f0: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
d300: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
d310: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
d320: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d330: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
d340: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
d350: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
d360: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
d370: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d380: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
d390: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
d3a0: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
d3b0: 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t+pPager->pageSi
d3c0: 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ze+4, &cksum);. 
d3d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d3e0: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
d3f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
d400: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
d410: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
d420: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
d430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d440: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
d450: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
d460: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
d470: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
d480: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d490: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
d4a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
d4b0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
d4c0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
d4d0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
d4e0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
d4f0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
d500: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
d510: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
d520: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
d530: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
d540: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d550: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
d560: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
d570: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
d580: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
d590: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
d5a0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
d5b0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
d5c0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
d5d0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
d5e0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
d5f0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
d600: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d610: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
d620: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d630: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
d640: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
d650: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
d660: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
d670: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
d680: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
d690: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
d6a0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
d6b0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
d6c0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
d6d0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
d6e0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
d6f0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
d700: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
d710: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
d720: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
d730: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
d740: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
d750: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
d760: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
d770: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
d780: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
d790: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
d7a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d7b0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
d7c0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
d7d0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
d7e0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
d7f0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
d800: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
d810: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
d820: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
d830: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
d840: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
d850: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
d860: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
d870: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
d880: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
d890: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
d8a0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
d8b0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
d8c0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
d8d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
d8e0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
d8f0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
d900: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
d910: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
d920: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
d930: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
d940: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
d950: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
d960: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
d970: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
d980: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
d990: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
d9a0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
d9b0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
d9c0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
d9d0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
d9e0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
d9f0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
da00: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
da10: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
da20: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
da30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
da40: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
da50: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
da60: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
da70: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
da80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
da90: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
daa0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
dab0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
dac0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
dad0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
dae0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
daf0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
db00: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
db10: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
db20: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
db30: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
db40: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
db50: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
db60: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
db70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
db80: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
db90: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
dba0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
dbb0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
dbc0: 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  a));.  if( pPage
dbd0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
dbe0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
dbf0: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
dc00: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
dc10: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
dc20: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
dc30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
dc40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dc50: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
dc60: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
dc70: 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
dc80: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20  t);.    if( pPg 
dc90: 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  ){.      makeCle
dca0: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
dcb0: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
dcc0: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
dcd0: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
dce0: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
dcf0: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
dd00: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
dd10: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
dd20: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
dd30: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
dd40: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
dd50: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
dd60: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
dd70: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
dd80: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
dd90: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
dda0: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
ddb0: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
ddc0: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
ddd0: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
dde0: 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
ddf0: 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
de00: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
de10: 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  ta;.    /* asser
de20: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
de30: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
de40: 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  ); */.    pData 
de50: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
de60: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
de70: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
de80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
de90: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
dea0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
deb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
dec0: 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67  initer(pPg, pPag
ded0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
dee0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
def0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
df00: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
df10: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
df20: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
df30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
df40: 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
df50: 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
df60: 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
df70: 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
df80: 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
df90: 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
dfa0: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
dfb0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
dfc0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
dfd0: 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
dfe0: 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
dff0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
e000: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e010: 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
e020: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
e030: 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
e040: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
e050: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
e060: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e070: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
e080: 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
e090: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
e0a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e0b0: 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
e0c0: 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
e0d0: 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
e0e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e0f0: 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
e100: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
e110: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
e120: 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
e130: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
e140: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e150: 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
e160: 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
e170: 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
e180: 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f  t zMaster may po
e190: 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d  int to Pager.pTm
e1a0: 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20  pSpace. So that 
e1b0: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a  buffer is not .*
e1c0: 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
e1d0: 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  use within this 
e1e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a  function..**.**.
e1f0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
e200: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
e210: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
e220: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
e230: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
e240: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
e250: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
e260: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
e270: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
e280: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
e290: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
e2a0: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
e2b0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
e2c0: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
e2d0: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
e2e0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
e2f0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
e300: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
e310: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
e320: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
e330: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
e340: 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
e350: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
e360: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
e370: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
e380: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  er_open = 0;.  s
e390: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
e3a0: 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ster;.  sqlite3_
e3b0: 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a  file *pJournal;.
e3c0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
e3d0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
e3e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
e3f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
e400: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
e410: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
e420: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
e430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
e440: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
e450: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e460: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
e470: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
e480: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
e490: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
e4a0: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
e4b0: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
e4c0: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
e4d0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ce..  */.  pMast
e4e0: 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
e4f0: 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
e500: 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  loc(pVfs->szOsFi
e510: 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
e520: 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
e530: 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
e540: 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
e550: 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
e560: 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
e570: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e580: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
e590: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
e5a0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
e5b0: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
e5c0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
e5d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e5e0: 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
e5f0: 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
e600: 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
e610: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e620: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
e630: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
e640: 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20  open = 1;..  rc 
e650: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e660: 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
e670: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
e680: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e690: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
e6a0: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
e6b0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
e6c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
e6d0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
e6e0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
e6f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65  ;.    int nMaste
e700: 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  rPtr = pPager->p
e710: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e720: 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  1;..    /* Load 
e730: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
e740: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
e750: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
e760: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
e770: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
e780: 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
e790: 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
e7a0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
e7b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
e7c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
e7d0: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
e7e0: 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
e7f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  r);.    if( !zMa
e800: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
e810: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e820: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
e830: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73  ;.    }.    zMas
e850: 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
e860: 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
e870: 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63  Journal];.    rc
e880: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
e890: 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
e8a0: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
e8b0: 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
e8c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e8d0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
e8e0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
e8f0: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
e900: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
e910: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
e920: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
e930: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
e940: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e950: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
e960: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
e970: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
e980: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
e990: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
e9a0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
e9b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e9c0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
e9d0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
e9e0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
e9f0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
ea00: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
ea10: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
ea20: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
ea30: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
ea40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
ea50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ea60: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
ea70: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
ea80: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
ea90: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
eaa0: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
eab0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
eac0: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
ead0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
eae0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
eaf0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
eb00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
eb10: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
eb20: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
eb30: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
eb40: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
eb50: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
eb60: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
eb70: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
eb80: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
eb90: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
eba0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ebb0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
ebc0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
ebd0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
ebe0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
ebf0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
ec00: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
ec10: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
ec20: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
ec30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
ec40: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
ec50: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
ec60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ec70: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
ec80: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ec90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
eca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
ecb0: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
ecc0: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
ecd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
ece0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ecf0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
ed00: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
ed10: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
ed20: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
ed30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ed40: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
ed50: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
ed60: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
ed70: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
ed80: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
ed90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
eda0: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
edb0: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
edc0: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
edd0: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
ede0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
edf0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
ee00: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
ee10: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
ee20: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
ee30: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
ee40: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
ee50: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
ee60: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
ee70: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
ee80: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
ee90: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
eea0: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
eeb0: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
eec0: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
eed0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
eee0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
eef0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
ef00: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
ef10: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
ef20: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
ef30: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
ef40: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
ef50: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
ef60: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
ef70: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
ef80: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
ef90: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
efa0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
efb0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
efc0: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
efd0: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
efe0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
eff0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
f000: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
f010: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
f020: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
f030: 73 20 63 61 73 65 20 61 6e 64 20 64 6f 20 6e 6f  s case and do no
f040: 74 20 64 6f 20 74 68 65 20 74 72 75 6e 63 61 74  t do the truncat
f050: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
f060: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
f070: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
f080: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
f090: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f0a0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
f0b0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
f0c0: 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65  CLUSIVE && pPage
f0d0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
f0e0: 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
f0f0: 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
f100: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
f120: 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
f130: 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
f140: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
f150: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
f160: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f170: 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
f180: 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
f190: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
f1a0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
f1b0: 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
f1c0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ze);.    }.  }. 
f1d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f1e0: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
f1f0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
f200: 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
f210: 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
f220: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
f230: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
f240: 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65  t the sectorSize
f250: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
f260: 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ager..**.** The 
f270: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74  sector size is t
f280: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
f290: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
f2a0: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
f2b0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
f2c0: 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69  ) and the pageSi
f2d0: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ze..*/.static vo
f2e0: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
f2f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
f300: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
f310: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
f320: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f330: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
f340: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
f350: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
f360: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
f370: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
f380: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
f390: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
f3a0: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
f3b0: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
f3c0: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
f3d0: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
f3e0: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
f3f0: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
f400: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f410: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
f420: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
f430: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
f440: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f450: 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze<pPager->pageS
f460: 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ize ){.    pPage
f470: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
f480: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f490: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
f4a0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
f4b0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
f4c0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
f4d0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
f4e0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
f4f0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
f500: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
f510: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
f520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
f530: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
f540: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
f550: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
f560: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
f570: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
f580: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
f590: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
f5a0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
f5b0: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
f5c0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
f5d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
f5e0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
f5f0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
f600: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
f610: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
f620: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
f630: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f640: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
f650: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
f660: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
f670: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
f680: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
f690: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
f6a0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
f6b0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
f6c0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
f6d0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
f6e0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
f6f0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
f700: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
f710: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
f720: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
f730: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
f740: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
f750: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
f760: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
f770: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
f780: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
f790: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
f7a0: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
f7b0: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
f7c0: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
f7d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f7e0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
f7f0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
f800: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
f810: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
f820: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
f830: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
f840: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
f850: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
f860: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
f870: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
f880: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
f890: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
f8a0: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
f8b0: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
f8c0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
f8d0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
f8e0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
f8f0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
f900: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
f910: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
f920: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
f930: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f940: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
f950: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
f960: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
f970: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
f980: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
f990: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
f9a0: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
f9b0: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
f9c0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
f9d0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
f9e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
f9f0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
fa00: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
fa10: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
fa20: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
fa30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
fa40: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
fa50: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
fa60: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
fa70: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
fa80: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
fa90: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
faa0: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
fab0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
fac0: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
fad0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
fae0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
faf0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
fb00: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
fb10: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
fb20: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
fb30: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
fb40: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
fb50: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
fb60: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
fb70: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
fb80: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
fb90: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
fba0: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
fbb0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
fbc0: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
fbd0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
fbe0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
fbf0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
fc00: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
fc10: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
fc20: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
fc30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
fc40: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
fc50: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
fc60: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
fc70: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
fc80: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
fc90: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
fca0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
fcb0: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
fcc0: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
fcd0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
fce0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
fcf0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
fd00: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
fd10: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
fd20: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
fd30: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
fd40: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
fd50: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
fd60: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
fd70: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
fd80: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
fd90: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
fda0: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
fdb0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
fdc0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
fdd0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
fde0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
fdf0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
fe00: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
fe10: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
fe20: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
fe30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fe40: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
fe50: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
fe60: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
fe70: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
fe80: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
fe90: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
fea0: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
feb0: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
fec0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
fed0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
fee0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
fef0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
ff00: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
ff10: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
ff20: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ff30: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ff40: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
ff50: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
ff60: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
ff70: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
ff80: 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
ff90: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
ffa0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ffb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
ffc0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
ffd0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
ffe0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fff0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
10000 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
10010 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10020 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10030 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
10040 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
10050 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10060 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
10070 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
10080 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
10090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
100a0 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
100b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
100c0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
100d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
100e0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
100f0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
10100 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
10110 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
10120 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
10130 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
10140 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
10150 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
10160 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10180 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
10190 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
101a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
101b0 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
101c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
101d0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
101e0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
101f0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
10200 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10210 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
10220 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
10230 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
10240 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10250 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
10260 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
10270 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
10280 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
10290 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
102a0 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
102b0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
102c0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
102d0 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
102e0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
102f0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
10300 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
10310 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
10320 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
10330 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
10340 61 6d 65 2b 31 29 3b 0a 20 20 61 73 73 65 72 74  ame+1);.  assert
10350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
10360 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
10370 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20  QLITE_OK .   || 
10380 28 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21  (zMaster[0] && !
10390 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
103a0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
103b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
103c0 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20 20 20  STS)) .  ){.    
103d0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
103e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
103f0 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
10400 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
10410 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
10420 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10430 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7a 4d  nalOff = 0;.  zM
10440 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  aster = 0;..  /*
10450 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
10460 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
10470 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
10480 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
10490 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
104a0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
104b0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
104c0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
104d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
104e0 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
104f0 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
10500 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
10510 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
10520 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
10530 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
10540 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
10550 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
10560 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
10570 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
10580 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
10590 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
105a0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
105b0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
105c0 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
105d0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
105e0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
105f0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
10600 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
10610 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
10620 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10630 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
10640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10650 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
10660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
10680 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10690 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
106a0 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
106b0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
106c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
106d0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
106e0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
106f0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
10700 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
10710 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
10720 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
10730 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
10740 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
10750 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
10760 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
10770 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
10780 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
10790 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
107a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
107b0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
107c0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
107d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
107e0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
107f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10800 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
10810 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
10820 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
10830 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
10840 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
10850 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
10860 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
10870 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
10880 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
10890 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
108a0 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
108b0 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
108c0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
108d0 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
108e0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
108f0 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
10900 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
10910 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
10920 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
10930 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
10940 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
10950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
10960 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
10970 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
10980 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
10990 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
109a0 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
109b0 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
109c0 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
109d0 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
109e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
109f0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
10a00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10a10 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
10a20 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10a30 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
10a40 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
10a50 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
10a60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10a70 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
10a80 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
10a90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
10aa0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
10ab0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
10ac0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
10ad0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
10ae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
10af0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
10b00 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
10b10 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10b20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
10b30 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10b40 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
10b50 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
10b60 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
10b70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10b90 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
10ba0 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
10bb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
10bc0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
10bd0 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
10be0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
10bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10c00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
10c10 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
10c20 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
10c30 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
10c40 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
10c50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
10c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
10c70 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
10c80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10c90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
10ca0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
10cb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
10cd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
10ce0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
10cf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10d10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
10d20 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
10d30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10d40 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
10d50 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
10d60 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
10d70 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
10d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d90 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
10da0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
10db0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
10dc0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
10dd0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
10de0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
10df0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20  thname+1);.  }. 
10e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10e10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
10e20 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
10e30 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
10e40 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
10e50 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
10e60 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  [0] ){.    /* If
10e70 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
10e80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
10e90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
10ea0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
10eb0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
10ec0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
10ed0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
10ee0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
10ef0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
10f00 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
10f10 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
10f20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
10f30 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
10f40 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
10f50 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
10f60 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
10f70 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
10f80 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10f90 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
10fa0 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
10fb0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
10fc0 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
10fd0 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
10fe0 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
10ff0 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
11000 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
11010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11020 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
11030 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
11040 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
11050 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
11060 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
11070 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
11080 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
11090 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
110a0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
110b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
110c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
110d0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
110e0 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
110f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
11100 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
11110 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
11120 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
11130 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
11140 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
11150 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
11160 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
11170 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11180 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
11190 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
111a0 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
111b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
111c0 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
111d0 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
111e0 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
111f0 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
11200 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
11210 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
11220 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
11230 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
11240 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
11250 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
11260 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f  al */.  i64 hdrO
11270 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20  ff;.  int nRec; 
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
112a0 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
112d0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
112e0 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
112f0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e  journalOff;.#ifn
11300 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a  def NDEBUG .  {.
11310 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a      i64 os_szJ;.
11320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11330 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11340 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
11350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11360 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
11370 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
11380 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
11390 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
113a0 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
113b0 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
113c0 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
113d0 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
113e0 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
113f0 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
11400 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
11410 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
11420 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
11430 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
11440 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
11450 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
11460 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
11470 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
11480 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
11490 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
114a0 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
114b0 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
114c0 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
114d0 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
114e0 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
114f0 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
11500 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
11510 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
11520 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
11530 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
11540 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
11550 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
11560 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
11570 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11580 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
11590 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
115a0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
115b0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
115c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
115d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
115e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
115f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
11600 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52  rnalOpen );.  nR
11610 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
11620 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
11630 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
11640 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
11650 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
11660 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
11670 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
11680 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
11690 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
116a0 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
116b0 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
116c0 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
116d0 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
116e0 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
116f0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
11700 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
11710 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
11720 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
11730 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ++){.    i64 off
11740 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65  set = i*(4+pPage
11750 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
11760 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
11770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
11780 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
11790 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b  tfd, offset, 0);
117a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
117b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
117c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
117d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
117e0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
117f0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
11800 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
11810 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
11820 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
11830 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
11840 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
11850 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
11860 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
11870 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
11880 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
11890 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
118a0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
118b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
118c0 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
118d0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
118e0 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
118f0 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
11900 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
11910 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
11920 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
11930 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
11940 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
11950 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
11960 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
11970 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
11980 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11990 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  n..  */.  pPager
119a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
119b0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
119c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
119d0 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
119e0 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
119f0 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
11a00 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
11a10 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
11a20 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
11a30 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
11a40 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11a50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
11a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
11a70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
11a80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11a90 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
11aa0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
11ab0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
11ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11ad0 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
11ae0 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20  2 nJRec;        
11af0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
11b00 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
11b10 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
11b20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
11b30 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
11b40 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
11b50 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
11b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11b70 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
11b80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
11b90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
11ba0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
11bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65    }.    if( nJRe
11bc0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
11bd0 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
11be0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11bf0 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
11c00 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
11c10 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31     for(i=nJRec-1
11c20 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
11c30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
11c40 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
11c50 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11c60 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
11c70 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
11c80 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11c90 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
11ca0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
11cb0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
11cc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11cd0 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
11ce0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
11cf0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
11d00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
11d10 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
11d20 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
11d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
11d40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
11d50 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
11d60 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
11d70 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
11d80 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
11d90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11da0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
11db0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
11dc0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
11dd0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
11de0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
11df0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
11e00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
11e10 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
11e20 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
11e30 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
11e40 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
11e50 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
11e60 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
11e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
11e80 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
11e90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11ea0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
11eb0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
11ec0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
11ed0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
11ee0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
11ef0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
11f00 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
11f10 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
11f20 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
11f30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
11f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
11f50 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
11f60 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
11f70 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
11f80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
11f90 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
11fa0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
11fb0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
11fc0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
11fd0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
11fe0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
11ff0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12000 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12010 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
12020 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
12030 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
12050 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
12060 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
12070 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
12080 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12090 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
120a0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
120b0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
120c0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
120d0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
120e0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
120f0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
12100 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
12120 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
12130 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
12140 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
12150 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
12160 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
12170 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
12180 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12190 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
121a0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
121b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
121c0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
121d0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
121e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
121f0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
12200 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
12210 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
12220 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
12230 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
12240 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
12250 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
12260 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
12270 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
12280 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
12290 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
122a0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
122b0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
122c0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
122d0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
122e0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
122f0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
12300 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12310 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
12320 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
12330 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
12340 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
12350 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
12360 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
12370 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
12380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
12390 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
123a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
123b0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
123c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
123d0 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
123e0 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
123f0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
12400 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
12410 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
12420 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
12430 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
12440 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12450 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
12460 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63  gs = (full_fsync
12470 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
12480 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
12490 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
124a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
124b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
124c0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
124d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
124e0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
124f0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
12500 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
12510 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
12520 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
12530 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
12540 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
12550 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
12560 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
12570 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
12580 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12590 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
125a0 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
125b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
125c0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
125d0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
125e0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
125f0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
12600 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
12610 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
12620 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
12630 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
12640 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
12650 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
12660 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
12670 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  ary.** file when
12680 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
12690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
126a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
126b0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p(.  sqlite3_vfs
126c0 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68   *pVfs,    /* Th
126d0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
126e0 79 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20  ystem layer */. 
126f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
12700 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
12710 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12720 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  tor here */.  ch
12730 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
12740 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
12750 68 65 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20  he file.  Might 
12760 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
12770 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
12780 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
12790 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
127a0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
127b0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
127c0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
127d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
127e0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
127f0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
12800 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
12810 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
12820 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
12830 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
12840 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12850 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
12860 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
12870 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
12880 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
12890 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
128a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
128b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
128c0 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  n(pVfs, zFilenam
128d0 65 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  e, pFile, vfsFla
128e0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
128f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12900 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
12910 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
12920 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
12930 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
12940 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
12950 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
12960 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
12970 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
12980 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
12990 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
129a0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
129b0 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
129c0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
129d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
129e0 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
129f0 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
12a00 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
12a10 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
12a20 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
12a30 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
12a40 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
12a50 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
12a60 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
12a70 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
12a80 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
12a90 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
12aa0 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
12ab0 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
12ac0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
12ad0 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
12ae0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
12af0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12b00 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
12b10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
12b20 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
12b30 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
12b40 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
12b50 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
12b60 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
12b70 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
12b80 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
12b90 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
12ba0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
12bb0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
12bc0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
12bd0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
12be0 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
12bf0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
12c00 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
12c10 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
12c20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12c30 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
12c40 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
12c50 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
12c60 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
12c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
12c80 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
12c90 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
12ca0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
12cb0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
12cd0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
12ce0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
12cf0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
12d00 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
12d10 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
12d20 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
12d30 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38  pen() */.){.  u8
12d40 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
12d50 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  *pPager = 0;.  i
12d60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12d70 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
12d80 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
12d90 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
12da0 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
12db0 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
12dc0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
12dd0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
12de0 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
12df0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
12e00 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
12e10 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e  ADLOCK)!=0;.  in
12e20 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
12e30 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
12e40 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
12e50 69 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65  int nDefaultPage
12e60 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
12e70 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
12e80 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a  har *zPathname;.
12e90 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b    int nPathname;
12ea0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
12eb0 6c 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e  lt return is a N
12ec0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ULL pointer */. 
12ed0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
12ee0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
12ef0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a   full pathname *
12f00 2f 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  /.  nPathname = 
12f10 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12f20 2b 31 3b 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20  +1;.  zPathname 
12f30 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
12f40 28 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 69  (nPathname);.  i
12f50 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
12f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12f70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12f80 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
12f90 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
12fa0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12fb0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12fc0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
12fd0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
12fe0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
12ff0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
13000 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
13010 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
13020 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
13030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
13040 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13050 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
13060 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
13070 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
13080 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
13090 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
130a0 28 70 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65  (pVfs, nPathname
130b0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
130c0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
130d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
130e0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
130f0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13100 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68   rc;.  }.  nPath
13110 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
13120 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
13130 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
13140 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74  for the pager st
13150 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61  ructure */.  pPa
13160 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ger = sqlite3Mal
13170 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a  locZero(.    siz
13180 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20  eof(*pPager) +  
13190 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
131a0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
131b0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
131c0 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ze +           /
131d0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
131e0 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20  le structure */ 
131f0 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46  .    pVfs->szOsF
13200 69 6c 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ile * 2 +       
13210 20 2f 2a 20 54 68 65 20 64 62 20 61 6e 64 20 73   /* The db and s
13220 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  tmt journal file
13230 73 20 2a 2f 20 0a 20 20 20 20 34 2a 6e 50 61 74  s */ .    4*nPat
13240 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20 20 20  hname + 40      
13250 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
13260 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20  me, zDirectory, 
13270 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 53 74 6d 74 4a  zJournal, zStmtJ
13280 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  rnl */.  );.  if
13290 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20  ( !pPager ){.   
132a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
132b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
132c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
132d0 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20  M;.  }.  pPtr = 
132e0 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  (u8 *)&pPager[1]
132f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
13300 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
13310 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
13320 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
13330 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
13340 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72  ile*0];.  pPager
13350 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65  ->stfd = (sqlite
13360 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
13370 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b  fs->szOsFile*1];
13380 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
13390 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
133a0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
133b0 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65  File*2];.  pPage
133c0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
133d0 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73  char*)&pPtr[pVfs
133e0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75  ->szOsFile*2+jou
133f0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20  rnalFileSize];. 
13400 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
13410 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
13420 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
13430 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
13440 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
13450 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
13460 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
13470 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
13480 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
13490 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
134a0 31 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  10];.  pPager->p
134b0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65  Vfs = pVfs;.  me
134c0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
134d0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
134e0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b  e, nPathname+1);
134f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13500 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zPathname);..  /
13510 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
13520 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
13530 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
13540 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
13550 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
13560 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
13570 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73  ->mxPathname - s
13580 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
13590 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
135a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
135b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
135c0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
135d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
135e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
135f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
13600 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13630 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
13640 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
13650 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
13660 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
13670 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
13680 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
13690 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
136a0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
136b0 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
136c0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
136d0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
136e0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
136f0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
13700 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
13710 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
13720 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
13730 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
13740 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
13750 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
13760 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
13770 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
13780 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
13790 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
137a0 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
137b0 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
137c0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
137d0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
137e0 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
137f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13800 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
13810 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
13820 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
13830 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13840 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13850 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
13860 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53 65 63  DefaultPage<iSec
13870 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
13880 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67       nDefaultPag
13890 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
138a0 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
138b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
138c0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
138d0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
138e0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
138f0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
13900 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
13910 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
13920 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
13930 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13940 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
13950 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
13960 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
13970 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
13980 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
13990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
139a0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
139b0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
139c0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
139d0 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65 66 61      for(ii=nDefa
139e0 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c  ultPage; ii<=SQL
139f0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
13a00 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
13a10 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
13a20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
13a30 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
13a40 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61 75 6c  i>>8)) ) nDefaul
13a50 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20 20 20  tPage = ii;.    
13a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13a70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
13a80 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
13a90 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
13aa0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
13ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
13ac0 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
13ad0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
13ae0 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
13af0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13b00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65  .  }else if( !me
13b10 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mDb ){.    /* If
13b20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
13b30 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
13b40 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
13b50 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
13b60 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
13b70 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
13b80 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
13b90 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
13ba0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
13bb0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
13bc0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
13bd0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
13be0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
13bf0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
13c00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13c10 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
13c20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
13c30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
13c40 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
13c50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68  >pTmpSpace = (ch
13c60 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
13c70 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50 61 67 65  loc(nDefaultPage
13c80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
13c90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
13ca0 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
13cb0 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a  e blocks above..
13cc0 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61    ** Free the Pa
13cd0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
13ce0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
13cf0 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65  ..  ** Since the
13d00 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
13d10 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
13d20 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
13d30 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
13d40 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
13d50 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
13d60 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72  Pager || !pPager
13d70 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
13d80 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13d90 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
13da0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13db0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
13dc0 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
13dd0 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
13de0 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  M:rc);.  }..  PA
13df0 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20  GERTRACE3("OPEN 
13e00 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
13e10 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
13e20 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
13e30 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43  ename);.  IOTRAC
13e40 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
13e50 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
13e60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
13e70 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67    /* Fill in Pag
13e80 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20  er.zDirectory[] 
13e90 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  */.  memcpy(pPag
13ea0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
13eb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
13ec0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b  e, nPathname+1);
13ed0 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28  .  for(i=strlen(
13ee0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13ef0 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67  ry); i>0 && pPag
13f00 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
13f10 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
13f20 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
13f30 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
13f40 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  i-1] = 0;..  /* 
13f50 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a  Fill in Pager.zJ
13f60 6f 75 72 6e 61 6c 5b 5d 20 61 6e 64 20 50 61 67  ournal[] and Pag
13f70 65 72 2e 7a 53 74 6d 74 4a 72 6e 6c 5b 5d 20 2a  er.zStmtJrnl[] *
13f80 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  /.  memcpy(pPage
13f90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
13fa0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
13fb0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65  nPathname);.  me
13fc0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
13fd0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
13fe0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39  ], "-journal", 9
13ff0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  );.  memcpy(pPag
14000 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20 70  er->zStmtJrnl, p
14010 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14020 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
14030 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
14040 7a 53 74 6d 74 4a 72 6e 6c 5b 6e 50 61 74 68 6e  zStmtJrnl[nPathn
14050 61 6d 65 5d 2c 20 22 2d 73 74 6d 74 6a 72 6e 6c  ame], "-stmtjrnl
14060 22 2c 20 31 30 29 3b 0a 0a 20 20 2f 2a 20 70 50  ", 10);..  /* pP
14070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14080 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
14090 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
140a0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
140b0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
140c0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
140d0 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
140e0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
140f0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
14100 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
14110 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
14120 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14130 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
14140 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14150 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
14160 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e 44  r->pageSize = nD
14170 65 66 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a  efaultPage;.  /*
14180 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
14190 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
141a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
141b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
141c0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
141d0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
141e0 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50  Page = 100;.  pP
141f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
14200 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
14210 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
14220 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
14230 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
14240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
14250 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
14260 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
14270 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
14280 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
14290 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
142a0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
142b0 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
142c0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
142d0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
142e0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
142f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
14300 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
14310 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
14320 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
14330 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
14340 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
14350 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
14360 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70  usiveMode = temp
14370 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
14380 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
14390 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
143a0 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
143b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
143c0 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
143d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
143e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
143f0 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
14400 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
14410 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
14420 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50  oSync?0:1);.  pP
14430 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
14440 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
14450 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
14460 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
14470 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14480 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
14490 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
144a0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
144b0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
144c0 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
144d0 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73  NT(nExtra);.  as
144e0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
144f0 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62  >pMethods||memDb
14500 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ||tempFile);.  i
14510 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
14520 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
14530 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
14540 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
14550 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
14560 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
14570 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
14580 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
14590 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
145a0 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
145b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
145c0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
145d0 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  NT.  pPager->iIn
145e0 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61  UseMM = 0;.  pPa
145f0 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20  ger->iInUseDB = 
14600 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  0;.  if( !memDb 
14610 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
14620 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
14630 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
14640 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
14650 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
14660 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14670 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
14680 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
14690 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
146a0 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
146b0 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20  e3PagerList ){. 
146c0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
146d0 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
146e0 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Prev==0 );.     
146f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14700 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65  t->pPrev = pPage
14710 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  r;.    }.    pPa
14720 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  ger->pPrev = 0;.
14730 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14740 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20  List = pPager;. 
14750 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14760 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20  _leave(mutex);. 
14770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
14780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14790 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
147a0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
147b0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
147c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
147d0 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
147e0 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
147f0 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
14800 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
14810 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
14820 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
14830 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
14840 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
14850 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
14860 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
14870 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
14880 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
14890 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
148a0 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
148b0 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
148c0 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
148d0 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
148e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
148f0 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
14900 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
14910 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
14920 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
14930 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
14940 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
14950 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
14960 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
14970 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
14980 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
14990 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
149a0 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
149b0 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
149c0 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
149d0 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
149e0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
149f0 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
14a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14a10 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
14a20 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
14a30 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
14a40 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
14a50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
14a60 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
14a70 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
14a80 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
14a90 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
14aa0 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
14ab0 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
14ac0 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
14ad0 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
14ae0 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
14af0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
14b00 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
14b10 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
14b20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
14b30 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
14b40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
14b50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
14b60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
14b70 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
14b80 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
14b90 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
14ba0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
14bb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
14bc0 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67  ge size to *pPag
14bd0 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75  eSize. If the su
14be0 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73  ggest new page s
14bf0 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72  ize is.** inappr
14c00 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
14c10 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
14c20 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
14c30 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62   that.** value b
14c40 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
14c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14c60 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14c70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
14c80 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a  16 *pPageSize){.
14c90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14ca0 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65  E_OK;.  u16 page
14cb0 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
14cc0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
14cd0 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
14ce0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
14cf0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
14d00 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
14d10 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20  .  if( pageSize 
14d20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
14d30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
14d40 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65    && !pPager->me
14d50 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  mDb && pPager->n
14d60 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  Ref==0 .  ){.   
14d70 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
14d80 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
14d90 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
14da0 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
14db0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
14dd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72  lse{.      pager
14de0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
14df0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14e00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14e10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14e20 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
14e30 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
14e40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14e50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
14e60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
14e70 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
14e80 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
14e90 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
14ea0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  e(pPager);.    }
14eb0 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a  .  }.  *pPageSiz
14ec0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
14ed0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  Size;.  return r
14ee0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
14ef0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
14f00 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
14f10 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
14f20 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
14f30 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
14f40 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
14f50 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
14f60 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
14f70 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
14f80 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
14f90 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
14fa0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
14fb0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
14fc0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
14fd0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
14fe0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
14ff0 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
15000 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
15010 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
15020 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
15030 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
15040 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
15050 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
15060 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
15070 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15080 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
15090 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
150a0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
150b0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
150c0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
150d0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
150e0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
150f0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
15100 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
15110 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
15120 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
15130 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
15140 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
15150 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
15160 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
15170 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
15180 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
15190 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
151a0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
151b0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
151c0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
151d0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
151e0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
151f0 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
15200 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
15210 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
15220 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
15230 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
15240 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
15250 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
15260 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
15270 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
15280 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
15290 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
152a0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
152b0 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
152c0 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
152d0 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
152e0 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
152f0 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
15300 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
15310 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
15320 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
15330 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
15340 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
15350 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
15360 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
15370 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
15380 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15390 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
153a0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
153b0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
153c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
153d0 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
153e0 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
153f0 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
15400 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
15410 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
15420 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
15430 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
15440 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
15450 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
15460 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
15470 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
15480 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
15490 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
154a0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
154b0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
154c0 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
154d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
154e0 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
154f0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15500 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
15510 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
15520 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
15530 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
15540 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
15550 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
15560 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
15570 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
15580 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
15590 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
155a0 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
155b0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
155c0 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
155d0 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
155e0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
155f0 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
15600 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
15610 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
15620 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
15630 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
15640 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
15650 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
15660 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
15670 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
15680 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
15690 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
156a0 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
156b0 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
156c0 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
156d0 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
156e0 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69  bout this)..*/.i
156f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15700 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
15710 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15720 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
15730 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
15740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15750 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
15760 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
15770 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e  (MEMDB||pPager->
15780 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
15790 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
157a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
157b0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
157c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
157d0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
157e0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
157f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
15800 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
15810 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
15820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
15830 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
15840 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
15860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15880 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
15890 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
158a0 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
158b0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
158c0 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
158d0 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
158e0 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
158f0 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
15900 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
15910 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
15920 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
15930 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
15940 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
15950 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
15960 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
15970 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
15980 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
15990 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
159a0 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
159b0 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
159c0 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
159d0 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
159e0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
159f0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
15a00 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a  ){.  i64 n = 0;.
15a10 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
15a20 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
15a30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
15a40 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
15a50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
15a60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
15a70 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
15a80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
15a90 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73   } else {.    as
15aa0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
15ab0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
15ac0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15ad0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66    if( (pPager->f
15ae0 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20  d->pMethods).   
15af0 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
15b00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
15b10 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
15b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15b30 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
15b40 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
15b50 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
15b60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
15b70 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74  Ref--;.      ret
15b80 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
15b90 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
15ba0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
15bb0 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
15bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15bd0 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
15be0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
15bf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
15c00 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
15c10 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15c20 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
15c30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
15c40 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
15c50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15c60 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
15c70 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d  .  if( n>pPager-
15c80 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
15c90 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
15ca0 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
15cb0 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  n;.}...#ifndef S
15cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
15cd0 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  YDB./*.** Clear 
15ce0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
15cf0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
15d00 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
15d10 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
15d20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15d30 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
15d40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
15d50 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
15d60 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
15d70 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
15d80 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
15d90 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
15da0 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
15db0 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
15dc0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
15dd0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
15de0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
15df0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
15e00 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
15e10 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61   Also set the pa
15e20 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74  ge number to 0 t
15e30 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
15e40 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
15e50 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68  ot part of any h
15e60 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20  ash chain. This 
15e70 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
15e80 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  use the.** sqlit
15e90 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
15ea0 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
15eb0 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
15ec0 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
15ed0 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
15ee0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
15ef0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
15f00 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
15f10 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
15f20 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
15f30 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
15f40 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
15f50 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15f60 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
15f70 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65  ==0 && pPg->pPre
15f80 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
15f90 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
15fa0 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
15fb0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
15fc0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
15fd0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
15fe0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
15ff0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
16000 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16010 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70  er->aHash[pPg->p
16020 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
16030 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b  Hash-1)]!=pPg );
16040 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
16050 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  ash->pNextHash =
16060 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
16070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16080 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20  t h = pPg->pgno 
16090 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
160a0 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  -1);.    pPager-
160b0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
160c0 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
160d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
160e0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
160f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
16100 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d  g, pPager));.  }
16110 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
16120 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
16130 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
16140 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
16150 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
16160 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
16170 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
16180 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
16190 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
161a0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
161b0 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
161c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
161d0 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
161e0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
161f0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
16200 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  ger;..  /* Unlin
16210 6b 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65  k from free page
16220 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69   list */.  lruLi
16230 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a  stRemove(pPg);..
16240 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
16250 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
16260 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
16270 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
16280 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
16290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
162a0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
162b0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
162c0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
162d0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
162e0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
162f0 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
16300 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
16310 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
16320 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
16330 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
16340 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
16350 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
16360 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
16370 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
16380 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
16390 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
163a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
163b0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
163c0 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
163d0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
163e0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
163f0 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
16400 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
16410 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
16420 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
16430 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
16440 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
16450 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
16460 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
16470 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
16480 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
16490 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
164a0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
164b0 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
164c0 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
164d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
164e0 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
164f0 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
16500 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
16510 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
16520 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
16530 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
16540 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
16560 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
16570 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
16580 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
16590 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
165a0 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
165b0 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
165c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165d0 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
165e0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f  extAll;.      IO
165f0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
16600 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
16610 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
16620 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
16630 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
16640 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
16650 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
16660 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
16670 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
16680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
16690 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
166a0 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
166b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
166c0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
166d0 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
166e0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
166f0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
16700 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
16710 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
16720 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
16730 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
16740 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
16750 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
16760 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
16770 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
16780 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
16790 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
167a0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
167b0 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
167c0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
167d0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
167e0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
167f0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
16800 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
16810 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
16820 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
16830 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
16840 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
16850 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
16860 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
16870 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16880 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
16890 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
168a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
168b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
168c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
168d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
168e0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
168f0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
16900 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
16910 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
16920 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16930 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
16940 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
16950 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
16960 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
16970 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
16980 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16990 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
169a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
169b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
169c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
169d0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
169e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
169f0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
16a00 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
16a10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
16a20 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
16a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16a40 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
16a50 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
16a60 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
16a70 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
16a80 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
16a90 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
16aa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16ab0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
16ac0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
16ad0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
16ae0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
16af0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
16b00 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
16b10 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
16b20 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16b30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16b40 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
16b50 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71  || MEMDB );.  sq
16b60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
16b70 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
16b80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
16b90 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
16ba0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
16bb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16bc0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
16bd0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
16be0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
16bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
16c10 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
16c20 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
16c30 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
16c40 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
16c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
16c70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
16c80 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  );.  rc = syncJo
16c90 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
16ca0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
16cb0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
16cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16cd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
16ce0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
16cf0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
16d00 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
16d10 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
16d20 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
16d30 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
16d40 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
16d50 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
16d60 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65  VE_LOCK);.  page
16d70 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
16d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16da0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
16db0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
16dc0 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
16dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16de0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
16df0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
16e00 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
16e10 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
16e20 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
16e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
16e40 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
16e50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
16e60 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
16e70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
16e80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
16e90 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
16ea0 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
16eb0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
16ec0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
16ed0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
16ee0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
16ef0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
16f00 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
16f10 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16f20 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
16f30 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
16f40 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
16f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
16f60 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
16f70 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
16f80 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
16f90 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
16fa0 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
16fb0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
16fc0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
16fd0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
16fe0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
16ff0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
17000 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
17010 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
17020 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
17030 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
17040 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
17050 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
17060 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  r){.#ifdef SQLIT
17070 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
17080 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
17090 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73   !MEMDB ){.    s
170a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
170b0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
170c0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
170d0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
170e0 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
170f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
17100 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
17110 67 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ger->pPrev ){.  
17120 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
17130 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  v->pNext = pPage
17140 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
17150 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
17160 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
17170 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ager->pNext;.   
17180 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
17190 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
171a0 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d    pPager->pNext-
171b0 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d  >pPrev = pPager-
171c0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
171d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
171e0 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
171f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  }.#endif..  disa
17200 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
17210 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61  _errors();.  pPa
17220 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
17230 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
17240 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
17250 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
17260 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  ger);.  pagerUnl
17270 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
17280 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
17290 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
172a0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
172b0 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
172c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
172d0 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
172e0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
172f0 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
17300 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17310 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
17320 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
17330 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
17340 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
17350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17360 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
17370 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
17380 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
17390 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
173a0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
173b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
173c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
173d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
173e0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
173f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
17400 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
17410 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
17420 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
17430 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
17440 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
17450 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
17460 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
17470 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
17480 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
17490 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   */..  sqlite3_f
174a0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
174b0 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  h);.  sqlite3_fr
174c0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
174d0 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  pace);.  sqlite3
174e0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
174f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17500 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
17510 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
17520 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
17530 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
17540 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
17550 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
17560 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
17570 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
17580 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
17590 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
175a0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
175b0 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
175c0 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
175d0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
175e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
175f0 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
17600 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
17610 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
17620 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
17630 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
17640 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
17650 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
17660 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
17670 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
17680 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
17690 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
176a0 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
176b0 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
176c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
176d0 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
176e0 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
176f0 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
17700 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
17710 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
17720 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
17730 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
17740 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
17750 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
17760 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
17770 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
17780 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
17790 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
177a0 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
177b0 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69 73 74  . */.    lruList
177c0 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20  Remove(pPg);.   
177d0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
177e0 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
177f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
17800 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
17810 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
17820 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
17830 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
17840 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
17850 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
17860 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
17870 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17880 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
17890 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
178a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
178b0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
178c0 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
178d0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
178e0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
178f0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
17900 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
17910 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
17920 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
17930 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
17940 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
17950 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
17960 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
17970 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
17980 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
17990 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
179a0 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65  ager);.  page_re
179b0 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c  f(pPg);.  pagerL
179c0 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72  eave(pPg->pPager
179d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
179e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
179f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
17a00 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
17a10 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
17a20 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
17a30 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
17a40 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
17a50 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
17a60 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
17a70 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
17a80 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
17a90 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
17aa0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17ab0 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
17ac0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
17ad0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
17ae0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
17af0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17b00 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
17b10 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
17b20 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
17b30 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
17b40 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
17b50 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
17b60 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
17b70 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
17b80 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
17b90 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
17ba0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
17bb0 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
17bc0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
17bd0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
17be0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17bf0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
17c00 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
17c10 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
17c20 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
17c30 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
17c40 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
17c50 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
17c60 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
17c70 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
17c80 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
17c90 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
17ca0 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
17cb0 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
17cc0 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
17cd0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
17ce0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
17cf0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
17d00 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
17d10 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
17d20 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
17d30 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
17d40 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
17d50 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
17d60 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
17d70 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
17d80 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
17d90 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
17da0 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
17db0 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
17dc0 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
17dd0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
17de0 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
17df0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
17e00 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
17e10 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
17e20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
17e30 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
17e40 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
17e50 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17e60 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
17e70 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
17e80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
17e90 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
17ea0 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
17eb0 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
17ec0 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
17ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
17ee0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
17ef0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
17f00 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
17f10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
17f20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
17f30 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
17f40 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
17f50 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
17f60 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
17f70 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
17f80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
17f90 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
17fa0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17fb0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
17fc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
17fd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
17fe0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
17ff0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
18000 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
18010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18030 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 61 73 73  );..      /* ass
18040 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
18050 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
18060 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
18070 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
18080 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
18090 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
180a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
180b0 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
180c0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
180d0 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
180e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
180f0 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
18100 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
18110 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
18120 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
18130 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
18140 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
18150 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
18160 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
18170 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
18180 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
18190 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
181a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
181b0 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
181c0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
181d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
181e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
181f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
18200 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
18210 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18220 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18230 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
18240 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18250 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
18260 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
18270 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
18280 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
18290 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
182a0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
182b0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
182c0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
182d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
182e0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
182f0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
18300 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
18310 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
18320 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
18330 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
18340 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
18350 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
18360 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
18370 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
18380 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
18390 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
183a0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
183b0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
183c0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
183d0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
183e0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
183f0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
18400 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
18410 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
18420 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
18430 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
18440 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
18450 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
18460 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
18470 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
18480 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
18490 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
184a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
184b0 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
184c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
184d0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
184e0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
184f0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
18500 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
18510 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
18520 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
18530 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18540 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
18550 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
18560 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
18570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18580 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
18590 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
185a0 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
185b0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
185c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
185d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
185e0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
185f0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
18600 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
18610 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
18620 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
18630 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
18640 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
18650 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
18660 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
18670 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
18680 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
18690 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
186a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
186b0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
186c0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
186d0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
186e0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
186f0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
18700 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
18710 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18720 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18730 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
18740 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
18750 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
18760 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
18770 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
18780 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
18790 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
187a0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
187b0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
187c0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
187d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
187e0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
187f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
18800 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18810 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
18820 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
18830 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
18840 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
18850 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
18860 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
18870 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
18880 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
18890 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
188a0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
188b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
188c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
188d0 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
188e0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
188f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18900 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
18910 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
18920 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
18930 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
18940 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
18950 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
18960 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
18970 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
18980 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
18990 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
189a0 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
189b0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
189c0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
189d0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
189e0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
189f0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
18a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18a10 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
18a20 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
18a30 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
18a40 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
18a50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
18a60 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
18a70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
18a80 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
18a90 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
18aa0 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
18ab0 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
18ac0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
18ad0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
18ae0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
18af0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
18b00 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
18b10 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
18b20 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
18b30 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
18b40 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
18b50 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
18b60 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
18b70 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
18b80 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
18b90 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
18ba0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18bb0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
18bc0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
18bd0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
18be0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
18bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18c00 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
18c10 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
18c20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
18c30 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
18c40 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
18c50 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
18c60 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
18c70 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
18c80 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
18c90 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
18ca0 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
18cb0 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
18cc0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
18cd0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
18ce0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
18cf0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
18d00 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
18d10 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
18d20 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
18d30 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
18d40 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
18d50 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
18d60 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
18d70 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
18d80 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
18d90 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
18da0 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
18db0 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
18dc0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
18dd0 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
18de0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
18df0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
18e00 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
18e10 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
18e20 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
18e30 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
18e40 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
18e50 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
18e60 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
18e70 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
18e80 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
18e90 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
18ea0 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
18eb0 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
18ec0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
18ed0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
18ee0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
18ef0 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
18f00 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
18f10 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
18f20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
18f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18f50 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
18f60 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
18f70 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
18f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18f90 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
18fa0 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
18fb0 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
18fc0 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
18fd0 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
18fe0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
18ff0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
19000 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
19010 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
19020 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
19030 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
19040 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
19050 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
19060 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
19070 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
19080 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19090 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
190a0 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
190b0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
190c0 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
190d0 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
190e0 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
190f0 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
19100 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19110 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
19120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
19130 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
19140 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
19150 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
19160 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
19170 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
19180 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
19190 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
191a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
191b0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
191c0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
191d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
191e0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
191f0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
19200 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19210 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
19220 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19230 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19250 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
19260 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
19270 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
19280 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
19290 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
192a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
192b0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
192c0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
192d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
192e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
192f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
19300 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
19310 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
19320 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
19330 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
19340 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
19350 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
19360 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
19370 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
19380 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
19390 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
193a0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
193b0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
193c0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
193d0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
193e0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
193f0 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
19400 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
19410 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
19420 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
19430 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
19440 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
19450 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
19460 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
19470 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
19480 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
19490 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
194a0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
194b0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
194c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
194d0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
194e0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
194f0 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
19500 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
19510 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
19520 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
19530 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
19540 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
19550 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
19560 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
19570 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
19580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19590 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
195a0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
195b0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
195c0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
195d0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
195e0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
195f0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
19600 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
19610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19620 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
19630 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
19640 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
19650 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
19660 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
19670 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
19680 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
19690 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
196a0 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
196b0 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
196c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
196d0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
196e0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
196f0 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
19700 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
19710 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
19720 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
19730 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
19740 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19750 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
19760 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66 64  pVfs, pPager->fd
19770 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
19780 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
197b0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
197c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
197d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
197e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
197f0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
19800 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
19810 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
19820 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
19830 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
19840 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
19850 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
19860 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
19870 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
19880 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
19890 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
198a0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
198b0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
198c0 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
198d0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
198e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
198f0 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
19900 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
19910 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
19920 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
19930 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
19940 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
19950 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
19960 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
19970 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
19980 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
19990 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
199a0 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
199b0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
199c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
199d0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
199e0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
199f0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
19a00 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
19a10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
19a20 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
19a30 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
19a40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19a50 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
19a60 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
19a70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19a80 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
19a90 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
19aa0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
19ab0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
19ac0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
19ad0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
19ae0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
19af0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
19b00 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19b10 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
19b20 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
19b30 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
19b40 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
19b50 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
19b60 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
19b70 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
19b80 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
19b90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
19ba0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
19bb0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
19bc0 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
19bd0 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
19be0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
19bf0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
19c00 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
19c10 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
19c20 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
19c30 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
19c40 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
19c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19c60 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
19c70 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
19c80 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
19c90 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
19ca0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
19cb0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
19cc0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
19cd0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
19ce0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
19cf0 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
19d00 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
19d10 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
19d20 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
19d30 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
19d40 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
19d50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19d60 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
19d70 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
19d80 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
19d90 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
19da0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
19db0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
19dc0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
19dd0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
19de0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19df0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
19e00 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
19e10 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
19e20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
19e30 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
19e40 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
19e50 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
19e60 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
19e70 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
19e80 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
19e90 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
19ea0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
19eb0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
19ec0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
19ed0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66  ager->pVfs;.  if
19ee0 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
19ef0 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
19f00 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
19f10 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20  >fd->pMethods ) 
19f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19f30 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
19f40 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
19f50 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
19f60 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
19f70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19f80 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
19f90 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
19fa0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
19fb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19fc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19fd0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
19fe0 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
19ff0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
1a000 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
1a010 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
1a020 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a030 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1a040 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
1a050 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
1a060 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
1a070 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
1a080 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
1a090 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
1a0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0b0 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
1a0c0 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
1a0d0 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
1a0e0 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
1a0f0 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
1a100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a110 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
1a120 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
1a130 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48  r **ppPg){.  PgH
1a140 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67  dr *pPg;.  *ppPg
1a150 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69   = 0;..  /* It i
1a160 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
1a170 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
1a180 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  unless the pager
1a190 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69   object.  ** poi
1a1a0 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61 67 65  nted to by pPage
1a1b0 72 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f  r has at least o
1a1c0 6e 65 20 66 72 65 65 20 70 61 67 65 20 28 70 61  ne free page (pa
1a1d0 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29  ge with nRef==0)
1a1e0 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1a1f0 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65  (!MEMDB);.  asse
1a200 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
1a210 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69  First);..  /* Fi
1a220 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
1a230 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
1a240 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
1a250 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
1a260 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
1a270 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
1a280 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
1a290 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
1a2a0 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1a2b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  ;..  /* If we co
1a2c0 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
1a2d0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
1a2e0 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
1a2f0 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  nc().  ** on the
1a300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1a310 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
1a320 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
1a330 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20   is a.  ** very 
1a340 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20  slow operation, 
1a350 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20  so we work hard 
1a360 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75  to avoid it.  Bu
1a370 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a  t sometimes.  **
1a380 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c   it can't be hel
1a390 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
1a3a0 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pPg==0 && pPager
1a3b0 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20  ->lru.pFirst){. 
1a3c0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
1a3d0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1a3e0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1a3f0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74  er->fd);.    int
1a400 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1a410 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
1a420 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1a430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a440 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
1a450 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
1a460 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1a470 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
1a480 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1a490 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
1a4a0 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
1a4b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
1a4c0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
1a4d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1a4e0 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
1a4f0 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69  oid ever modifyi
1a500 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ng a journal.   
1a510 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
1a520 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
1a530 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
1a540 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
1a550 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
1a560 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1a570 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
1a580 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
1a590 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  er is.      ** t
1a5a0 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
1a5b0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
1a5c0 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f  dated)..      */
1a5d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1a5e0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  Rec = 0;.      a
1a5f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1a600 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
1a610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a620 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1a630 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
1a640 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1a650 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
1a660 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1a670 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a690 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
1a6a0 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d  >lru.pFirst;.  }
1a6b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1a6c0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
1a6d0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
1a6e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a6f0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
1a700 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irty..  */.  if(
1a710 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
1a720 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
1a730 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
1a740 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d  Sync==0 );.    m
1a750 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1a760 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1a770 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1a780 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
1a790 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1a7a0 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
1a7b0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1a7c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a7e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a7f0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1a800 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
1a810 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
1a820 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
1a830 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
1a840 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
1a850 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
1a860 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
1a870 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
1a880 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
1a890 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
1a8a0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1a8b0 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
1a8c0 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
1a8d0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
1a8e0 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65  .  ** It is nece
1a8f0 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
1a900 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
1a910 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
1a920 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67  ollback.  ** mig
1a930 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
1a940 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
1a950 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
1a960 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
1a970 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  er.  ** that is 
1a980 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
1a990 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
1a9a0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
1a9b0 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  pages must.  ** 
1a9c0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
1a9d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
1a9e0 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
1a9f0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  */.  if( pPg->al
1aa00 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
1aa10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c      IOTRACE(("AL
1aa20 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70  WAYS_ROLLBACK %p
1aa30 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1aa40 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
1aa50 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1aa60 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
1aa70 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
1aa80 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
1aa90 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
1aaa0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
1aab0 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65  age(pPg);.  asse
1aac0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30  rt( pPg->pgno==0
1aad0 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70   );..  *ppPg = p
1aae0 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
1aaf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
1ab00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ab10 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1ab20 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  T./*.** This fun
1ab30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ab40 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
1ab50 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
1ab60 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
1ab70 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
1ab80 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
1ab90 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
1aba0 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
1abb0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
1abc0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
1abd0 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
1abe0 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  3_free()ed..**.*
1abf0 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
1ac00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1ac10 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
1ac20 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
1ac30 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
1ac40 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
1ac50 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65  ion returns. The
1ac60 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1ac70 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1ac80 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f  r .** of bytes o
1ac90 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65  f memory release
1aca0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1acb0 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
1acc0 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
1acd0 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
1ace0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
1acf0 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
1ad00 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20  released so far 
1ad10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1ad20 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
1ad30 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74   /* The MEM2 mut
1ad40 65 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  ex */.  Pager *p
1ad50 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1ad60 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1ad70 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a  ng over pagers *
1ad80 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
1ad90 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20 20  *savedBusy;     
1ada0 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66  /* Saved copy of
1adb0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1adc0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1add0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1ade0 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d   Acquire the mem
1adf0 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d  ory-management m
1ae00 75 74 65 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65  utex.  */.  mute
1ae10 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
1ae20 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
1ae30 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
1ae40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1ae50 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
1ae60 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c  ..  /* Signal al
1ae70 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
1ae80 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f  ctions that memo
1ae90 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61  ry management wa
1aea0 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65  nts.  ** to have
1aeb0 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 70   access to the p
1aec0 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  agers..  */.  fo
1aed0 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33  r(pPager=sqlite3
1aee0 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65  PagerList; pPage
1aef0 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  r; pPager=pPager
1af00 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70  ->pNext){.     p
1af10 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
1af20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  = 1;.  }..  whil
1af30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1af40 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
1af50 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 20 29  Released<nReq) )
1af60 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1af70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 52 65  ;.    PgHdr *pRe
1af80 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a  cycled;. .    /*
1af90 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
1afa0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 20 74  age to recycle t
1afb0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1afc0 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e 20 49  uire a sync(). I
1afd0 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  f.    ** this is
1afe0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 66   not possible, f
1aff0 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64 6f 65  ind one that doe
1b000 73 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63  s require a sync
1b010 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ()..    */.    s
1b020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b030 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
1b040 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1b050 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
1b060 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  ;.    pPg = sqli
1b070 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
1b080 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20  FirstSynced;.   
1b090 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 28   while( pPg && (
1b0a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b0b0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49   pPg->pPager->iI
1b0c0 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20  nUseDB) ){.     
1b0d0 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65   pPg = pPg->gfre
1b0e0 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  e.pNext;.    }. 
1b0f0 20 20 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20     if( !pPg ){. 
1b100 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
1b110 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
1b120 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  irst;.      whil
1b130 65 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70  e( pPg && pPg->p
1b140 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20  Pager->iInUseDB 
1b150 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d  ){.        pPg =
1b160 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78   pPg->gfree.pNex
1b170 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1b180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1b190 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1b1a0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1b1b0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1b1c0 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  _LRU));..    /* 
1b1d0 49 66 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20  If pPg==0, then 
1b1e0 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20  the block above 
1b1f0 68 61 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69  has failed to fi
1b200 6e 64 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20  nd a page to.   
1b210 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20   ** recycle. In 
1b220 74 68 69 73 20 63 61 73 65 20 72 65 74 75 72 6e  this case return
1b230 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74   early - no furt
1b240 68 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a  her memory will.
1b250 20 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73      ** be releas
1b260 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1b270 66 28 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b  f( !pPg ) break;
1b280 0a 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ..    pPager = p
1b290 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1b2a0 61 73 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65  assert(!pPg->nee
1b2b0 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50  dSync || pPg==pP
1b2c0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1b2d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1b2e0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70  g->needSync || p
1b2f0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  Pg==pPager->lru.
1b300 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20  pFirstSynced);. 
1b310 20 0a 20 20 20 20 73 61 76 65 64 42 75 73 79 20   .    savedBusy 
1b320 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  = pPager->pBusyH
1b330 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67  andler;.    pPag
1b340 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1b350 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1b360 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
1b370 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29  ger, &pRecycled)
1b380 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42  ;.    pPager->pB
1b390 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76  usyHandler = sav
1b3a0 65 64 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65  edBusy;.    asse
1b3b0 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50  rt(pRecycled==pP
1b3c0 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  g || rc!=SQLITE_
1b3d0 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  OK);.    if( rc=
1b3e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3f0 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
1b400 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
1b410 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
1b420 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
1b430 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d  en .      ** rem
1b440 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
1b450 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
1b460 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
1b470 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
1b480 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64  ** (pFirstSynced
1b490 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69  ). It is still i
1b4a0 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20  n the all pages 
1b4b0 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20  (pAll) list. .  
1b4c0 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
1b4d0 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
1b4e0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
1b4f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1b500 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68  * Todo: Check th
1b510 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69  e Pager.pStmt li
1b520 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
1b530 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a  this is Ok. It .
1b540 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
1b550 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20  y is though..   
1b560 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64     */.      PgHd
1b570 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61  r *pTmp;.      a
1b580 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
1b590 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61      if( pPg==pPa
1b5a0 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1b5b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
1b5c0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
1b5d0 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ll;.      }else{
1b5e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54  .        for( pT
1b5f0 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  mp=pPager->pAll;
1b600 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21   pTmp->pNextAll!
1b610 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  =pPg; pTmp=pTmp-
1b620 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20  >pNextAll ){}.  
1b630 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78        pTmp->pNex
1b640 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  tAll = pPg->pNex
1b650 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tAll;.      }.  
1b660 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
1b670 20 28 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a   (.          siz
1b680 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
1b690 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
1b6a0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
1b6b0 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
1b6c0 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
1b6d0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
1b6e0 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20  gHistory) .     
1b6f0 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43   );.      IOTRAC
1b700 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
1b710 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70   *\n", pPager, p
1b720 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
1b730 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1b740 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
1b750 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
1b760 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
1b770 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
1b780 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65  >nPage--;.    }e
1b790 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
1b7a0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
1b7b0 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
1b7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b7d0 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  le or .      ** 
1b7e0 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
1b7f0 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
1b800 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
1b810 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
1b820 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
1b830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
1b840 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
1b850 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
1b860 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  ariable..      *
1b870 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c  * The error will
1b880 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
1b890 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65  the user (or use
1b8a0 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20  rs, in the case 
1b8b0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73  .      ** of a s
1b8c0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
1b8d0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
1b8e0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
1b8f0 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
1b900 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
1b910 72 74 28 0a 20 20 20 20 20 20 20 20 20 20 28 72  rt(.          (r
1b920 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
1b930 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20  IOERR ||.       
1b940 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55     rc==SQLITE_FU
1b950 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LL ||.          
1b960 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a  rc==SQLITE_BUSY.
1b970 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
1b980 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b990 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1b9a0 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61  RVED );.      pa
1b9b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1b9c0 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , rc);.    }.  }
1b9d0 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  ..  /* Clear the
1b9e0 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1b9f0 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c  nt flags and rel
1ba00 65 61 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20  ease the mutex. 
1ba10 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1ba20 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1ba30 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1ba40 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1ba50 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1ba60 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d  InUseMM = 0;.  }
1ba70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ba80 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a  _leave(mutex);..
1ba90 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
1baa0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1bab0 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20  released.  */.  
1bac0 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64  return nReleased
1bad0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1bae0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
1baf0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f  RY_MANAGEMENT */
1bb00 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1bb10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1bb20 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1bb30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bb40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1bb50 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
1bb60 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
1bb70 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
1bb80 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
1bb90 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
1bba0 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
1bbb0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
1bbc0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
1bbd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
1bbe0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
1bbf0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
1bc00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bc10 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bc20 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
1bc30 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
1bc40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1bc50 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1bc60 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1bc70 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1bc80 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1bc90 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
1bca0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1bcb0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1bcc0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1bcd0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1bce0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1bcf0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1bd00 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1bd10 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  );.  if( pgno==1
1bd20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
1bd30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1bd40 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52  rs, &((u8*)PGHDR
1bd50 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32  _TO_DATA(pPg))[2
1bd60 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
1bda0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1bdb0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1bdc0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
1bdd0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
1bde0 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52  o, 3);.  PAGERTR
1bdf0 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70  ACE4("FETCH %d p
1be00 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1be10 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1be20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1be30 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1be40 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1be50 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pPg));.  return 
1be60 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1be70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1be80 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
1be90 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1bea0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a  required before.
1beb0 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72  ** data may be r
1bec0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
1bed0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
1bee0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73   shared lock has
1bef0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
1bf00 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20   obtained, this 
1bf10 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1bf20 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64  -op..**.** Immed
1bf30 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
1bf40 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65  aining the share
1bf50 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69  d lock (if requi
1bf60 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74  red), this funct
1bf70 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f  ion.** checks fo
1bf80 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
1bf90 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20  file. If one is 
1bfa0 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65  found, an emerge
1bfb0 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  ncy rollback.** 
1bfc0 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d  is performed imm
1bfd0 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ediately..*/.sta
1bfe0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
1bff0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
1c000 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1c010 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c020 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a  int isHot = 0;..
1c030 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1c040 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
1c050 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
1c060 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
1c070 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
1c080 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
1c090 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
1c0a0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
1c0b0 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  the chance to cl
1c0c0 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
1c0d0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
1c0e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1c0f0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1c100 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
1c110 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
1c120 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
1c130 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
1c140 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1c150 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
1c160 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1c170 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1c180 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ode ){.    if( p
1c190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c1a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f  en ){.      isHo
1c1b0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
1c1c0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1c1d0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1c1e0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
1c1f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1c200 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1c210 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
1c220 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1c230 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
1c240 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
1c250 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
1c260 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
1c270 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
1c280 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
1c290 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
1c2a0 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
1c2b0 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
1c2c0 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
1c2d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1c2e0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1c2f0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1c300 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
1c310 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1c320 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1c330 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1c340 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74  _UNLOCK || isHot
1c350 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c360 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1c370 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66  er->pVfs;.    if
1c380 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1c390 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c3a0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1c3b0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1c3c0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
1c3d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c3e0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1c3f0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
1c400 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
1c410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c420 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c430 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1c440 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1c450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1c460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c470 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1c480 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
1c490 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
1c4a0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
1c4b0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1c4c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1c4d0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
1c4e0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1c4f0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
1c500 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
1c510 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
1c520 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c530 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  if( hasHotJourna
1c540 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69 73 48  l(pPager) || isH
1c550 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ot ){.        /*
1c560 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
1c570 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
1c580 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
1c590 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
1c5a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
1c5b0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
1c5c0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1c5d0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
1c5e0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
1c5f0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
1c600 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
1c610 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
1c620 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
1c630 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
1c640 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
1c650 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
1c660 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
1c670 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
1c680 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1c690 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
1c6a0 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
1c6b0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
1c6c0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
1c6d0 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
1c6e0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1c6f0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
1c700 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
1c710 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
1c720 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
1c730 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
1c740 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
1c750 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
1c760 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
1c770 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
1c780 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e  * obtain its own
1c790 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1c7a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c7b0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1c7c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1c7d0 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55  ger->state<EXCLU
1c7e0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
1c7f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c800 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1c810 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
1c820 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
1c830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1c850 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
1c860 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c870 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1c880 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1c890 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  c);.          }.
1c8a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c8b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1c8c0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1c8d0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f     }. .        /
1c8e0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
1c8f0 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
1c900 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
1c910 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
1c920 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
1c930 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
1c940 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
1c950 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1c960 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
1c970 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
1c980 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
1c990 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
1c9a0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
1c9b0 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
1c9c0 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  open unless the 
1c9d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1c9e0 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20  le holds.       
1c9f0 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
1ca00 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
1ca10 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
1ca20 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
1ca30 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1ca40 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
1ca50 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
1ca60 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
1ca70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   **.        ** O
1ca80 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1ca90 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1caa0 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
1cab0 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
1cac0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1cad0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1cae0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1caf0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1cb00 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
1cb10 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
1cb20 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
1cb30 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
1cb40 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
1cb50 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
1cb60 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
1cb70 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
1cb80 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
1cb90 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
1cba0 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
1cbb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
1cbc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1cbd0 20 69 66 28 20 21 69 73 48 6f 74 20 29 7b 0a 20   if( !isHot ){. 
1cbe0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1cbf0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1cc00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cc10 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
1cc20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1cc30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1cc40 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20  XISTS) ){.      
1cc50 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
1cc60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1cc70 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
1cc80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1cc90 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1cca0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
1ccb0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1ccc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1cce0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1ccf0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1cd00 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1cd10 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1cd30 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1cd40 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
1cd50 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
1cd60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6f            if( fo
1cd70 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1cd80 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
1cd90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1cda0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1cdb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cdc0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1cdd0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
1cde0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1cdf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ce00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ce20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1ce30 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1ce40 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
1ce50 4c 49 54 45 5f 4e 4f 4d 45 4d 7c 7c 72 63 3d 3d  LITE_NOMEM||rc==
1ce60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1ce70 45 4d 29 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55  EM)?rc:SQLITE_BU
1ce80 53 59 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  SY);.        }. 
1ce90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1cea0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
1ceb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cec0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1ced0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1cee0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1cef0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1cf00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
1cf10 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
1cf20 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1cf30 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
1cf40 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
1cf50 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1cf60 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
1cf70 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
1cf80 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
1cf90 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
1cfa0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
1cfb0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
1cfc0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1cfd0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
1cfe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d000 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d010 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d030 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1d040 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1d050 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20  HARED || .      
1d060 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
1d070 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
1d080 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
1d090 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
1d0a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
1d0b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d0c0 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1d0d0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
1d0e0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
1d0f0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
1d100 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d110 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
1d120 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
1d130 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
1d140 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
1d150 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a  vious.        **
1d160 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1d170 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
1d180 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1d190 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
1d1a0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
1d1b0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
1d1c0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
1d1d0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
1d1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68  .        ** cach
1d1f0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
1d200 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
1d210 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
1d220 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
1d230 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
1d240 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  inning.        *
1d250 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
1d260 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
1d270 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
1d280 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
1d290 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32  .        ** a 32
1d2a0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
1d2b0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
1d2c0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
1d2d0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
1d2e0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
1d2f0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
1d300 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
1d310 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
1d320 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
1d330 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20  in use..        
1d340 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ** .        ** T
1d350 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
1d360 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
1d370 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
1d380 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
1d390 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
1d3a0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
1d3b0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
1d3c0 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
1d3d0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ll that.        
1d3e0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
1d3f0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20  lected..        
1d400 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
1d410 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
1d420 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d430 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20  Vers)];.        
1d440 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1d450 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a  count(pPager);..
1d460 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1d470 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1d480 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d490 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1d4a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1d4b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d4c0 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
1d4d0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1d4e0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
1d4f0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
1d500 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
1d510 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d520 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1d530 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
1d540 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1d550 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
1d560 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d580 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d590 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1d5a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d5b0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1d5c0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
1d5d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1d5e0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
1d5f0 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
1d600 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
1d610 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1d620 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1d630 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
1d640 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1d650 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1d660 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d670 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1d680 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1d690 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1d6a0 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
1d6b0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1d6c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1d6d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1d6e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1d6f0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1d700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1d710 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d720 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67  ** Allocate a Pg
1d730 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69  Hdr object.   Ei
1d740 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e 65  ther create a ne
1d750 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a  w one or reuse.*
1d760 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  * an existing on
1d770 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74  e that is not ot
1d780 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a  herwise in use..
1d790 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64  **.** A new PgHd
1d7a0 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  r structure is c
1d7b0 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66  reated if any of
1d7c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1d7d0 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a  re.** true:.**.*
1d7e0 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1d7f0 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ve not exceeded 
1d800 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  our maximum allo
1d810 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65  cated cache size
1d820 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73 20  .**          as 
1d830 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41 47  set by the "PRAG
1d840 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63  MA cache_size" c
1d850 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1d860 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72 65    (2)  There are
1d870 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72   no unused PgHdr
1d880 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62   objects availab
1d890 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  le at this time.
1d8a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1d8b0 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  This is an in-me
1d8c0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1d8d0 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68  *.**     (4)  Th
1d8e0 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72  ere are no PgHdr
1d8f0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f   objects that do
1d900 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a   not require a j
1d910 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
1d920 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64     file sync and
1d930 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a   a sync of the j
1d940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
1d950 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
1d960 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e       prohibited.
1d970 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1d980 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  , reuse an exist
1d990 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f  ing PgHdr.  In o
1d9a0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73  ther words, reus
1d9b0 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  e an.** existing
1d9c0 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66   PgHdr if all of
1d9d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1d9e0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1d9f0 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
1da00 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65 65  reached or excee
1da10 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ded the maximum 
1da20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
1da30 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62         allowed b
1da40 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  y "PRAGMA cache_
1da50 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  size"..**.**    
1da60 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20 61   (2)  There is a
1da70 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65   PgHdr available
1da80 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65   with PgHdr->nRe
1da90 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  f==0.**.**     (
1daa0 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69  3)  We are not i
1dab0 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
1dac0 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20  atabase.**.**   
1dad0 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74 68    (4)  Either th
1dae0 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61  ere is an availa
1daf0 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20 64  ble PgHdr that d
1db00 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20  oes not need.** 
1db10 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20 73           to be s
1db20 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72  ynced to disk or
1db30 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69   else disk synci
1db40 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ng is currently.
1db50 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
1db60 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wed..*/.static i
1db70 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65  nt pagerAllocate
1db80 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1db90 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1dba0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1dbb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
1dbc0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79   *pPg;.  int nBy
1dbd0 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65  teHdr;..  /* Cre
1dbe0 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72 20  ate a new PgHdr 
1dbf0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
1dc00 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65  ur conditions de
1dc10 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76  fined .  ** abov
1dc20 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20  e are met: */.  
1dc30 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1dc40 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
1dc50 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c  .   || pPager->l
1dc60 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  ru.pFirst==0 .  
1dc70 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
1dc80 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1dc90 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
1dca0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1dcb0 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  c).  ){.    if( 
1dcc0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70  pPager->nPage>=p
1dcd0 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a  Pager->nHash ){.
1dce0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69        pager_resi
1dcf0 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50  ze_hash_table(pP
1dd00 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70  ager,.         p
1dd10 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36  Pager->nHash<256
1dd20 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d   ? 256 : pPager-
1dd30 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20  >nHash*2);.     
1dd40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61   if( pPager->nHa
1dd50 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sh==0 ){.       
1dd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1dd70 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
1dd80 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1dd90 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1dda0 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76   }.    pagerLeav
1ddb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 6e  e(pPager);.    n
1ddc0 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f 66  ByteHdr = sizeof
1ddd0 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66 28  (*pPg) + sizeof(
1dde0 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
1ddf0 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
1de00 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
1de10 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a 20  of(PgHistory);. 
1de20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1de30 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64  _malloc( nByteHd
1de40 72 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  r + pPager->page
1de50 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65  Size );.    page
1de60 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1de70 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
1de80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1de90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1dea0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
1deb0 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
1dec0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20      memset(pPg, 
1ded0 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20 20  0, nByteHdr);.  
1dee0 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20 28    pPg->pData = (
1def0 76 6f 69 64 2a 29 28 6e 42 79 74 65 48 64 72 20  void*)(nByteHdr 
1df00 2b 20 28 63 68 61 72 2a 29 70 50 67 29 3b 0a 20  + (char*)pPg);. 
1df10 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
1df20 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67   pPager;.    pPg
1df30 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
1df40 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70  ger->pAll;.    p
1df50 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
1df60 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  g;.    pPager->n
1df70 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  Page++;.  }else{
1df80 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20  .    /* Recycle 
1df90 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  an existing page
1dfa0 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66   with a zero ref
1dfb0 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72  -count. */.    r
1dfc0 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
1dfd0 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
1dfe0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1dff0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
1e000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1e010 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20  ERR_BLOCKED;.   
1e020 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1e030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e040 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1e050 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1e060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e070 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1e080 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
1e090 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a  ssert(pPg);.  }.
1e0a0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a    *ppPg = pPg;..
1e0b0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1e0c0 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut:.  return rc;
1e0d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1e0e0 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20  ure we have the 
1e0f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61  content for a pa
1e100 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
1e110 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
1e120 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1e130 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1e140 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
1e150 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74  was.** just init
1e160 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
1e170 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
1e180 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  g read from disk
1e190 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20  ..** But now we 
1e1a0 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61  need the real da
1e1b0 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20  ta off of disk. 
1e1c0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   So make sure we
1e1d0 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65  .** have it.  Re
1e1e0 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64  ad it in if we d
1e1f0 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c  o not have it al
1e200 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ready..*/.static
1e210 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63   int pager_get_c
1e220 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50  ontent(PgHdr *pP
1e230 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
1e240 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69  eedRead ){.    i
1e250 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
1e260 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
1e270 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
1e280 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e2a0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1e2b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e2c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e2d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e2e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e2f0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1e300 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
1e310 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1e320 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
1e330 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
1e340 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
1e350 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
1e360 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
1e370 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
1e380 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
1e390 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1e3a0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
1e3b0 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
1e3c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
1e3d0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1e3e0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
1e3f0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
1e400 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
1e410 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
1e420 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
1e430 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
1e440 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
1e450 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1e460 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
1e470 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
1e480 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
1e490 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
1e4a0 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
1e4b0 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
1e4c0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
1e4d0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
1e4e0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
1e4f0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
1e500 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
1e510 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
1e520 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
1e530 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1e540 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1e550 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
1e560 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1e570 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1e580 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e590 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
1e5a0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
1e5b0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
1e5c0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1e5d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1e5e0 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
1e5f0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1e600 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
1e610 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
1e620 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
1e630 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
1e640 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
1e650 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
1e660 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1e670 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
1e680 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
1e690 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
1e6a0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
1e6b0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
1e6c0 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
1e6d0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
1e6e0 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
1e6f0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
1e700 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
1e710 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
1e720 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
1e730 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1e740 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
1e750 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67  s false, the pag
1e760 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61  e contents are a
1e770 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
1e780 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f  m disk..** If no
1e790 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
1e7a0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
1e7b0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1e7c0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
1e7d0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
1e7e0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f  at this time, so
1e7f0 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73   do not do a dis
1e800 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69  k read.  Just fi
1e810 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ll in the.** pag
1e820 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
1e830 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20  eros.  But mark 
1e840 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65  the fact that we
1e850 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74   have not read t
1e860 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79  he.** content by
1e870 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
1e880 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
1e890 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20  .  Later on, if 
1e8a0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1e8b0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1e8c0 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f  d on this page o
1e8d0 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
1e8e0 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61  e is.** called a
1e8f0 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74  gain with noCont
1e900 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  ent==0, that mea
1e910 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
1e920 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ent is needed.**
1e930 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65   and the disk re
1e940 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
1e950 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
1e960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e970 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
1e980 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1e990 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
1e9a0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
1e9b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1e9c0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
1e9d0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1e9e0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
1e9f0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1ea00 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
1ea10 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1ea20 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
1ea30 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
1ea40 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
1ea50 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
1ea60 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
1ea70 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
1ea80 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
1ea90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1eaa0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1eab0 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  UNLOCK || pPager
1eac0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1ead0 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1eae0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
1eaf0 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
1eb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1eb10 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
1eb20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
1eb30 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
1eb40 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74  zero, is request
1eb50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1eb60 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
1eb70 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c  NO || pgno==0 ||
1eb80 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
1eb90 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1eba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ebb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ebc0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
1ebd0 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
1ebe0 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
1ebf0 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
1ec00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1ec10 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  =0 );.  *ppPage 
1ec20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 0;..  /* If th
1ec30 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1ec40 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
1ec50 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
1ec60 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
1ec70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1ec80 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1ec90 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  () is a no-op if
1eca0 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73   .  ** a databas
1ecb0 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  e lock is alread
1ecc0 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72  y held..  */.  r
1ecd0 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c  c = pagerSharedL
1ece0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
1ecf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ed00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1ed10 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
1ed20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1ed30 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1ed40 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1ed50 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1ed60 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
1ed70 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
1ed80 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1ed90 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
1eda0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
1edb0 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e  int nMax;.    in
1edc0 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  t h;.    PAGER_I
1edd0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
1ede0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  s);.    rc = pag
1edf0 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  erAllocatePage(p
1ee00 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
1ee10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ee20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ee30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1ee40 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
1ee50 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
1ee60 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e   !MEMDB || pgno>
1ee70 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ee80 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1ee90 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
1eea0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
1eeb0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1eec0 29 7b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73  ){.#if 0.      s
1eed0 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
1eee0 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
1eef0 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 23  rnal, pgno/8);.#
1ef00 65 6e 64 69 66 0a 20 20 20 20 20 20 61 73 73 65  endif.      asse
1ef10 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ef20 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
1ef30 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ef40 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
1ef50 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
1ef60 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
1ef70 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
1ef80 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1ef90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
1efa0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1efb0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1efc0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
1efd0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
1efe0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
1eff0 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
1f000 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70  NFO(pPg);..    p
1f010 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
1f020 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1f030 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
1f040 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
1f050 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
1f060 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
1f070 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
1f080 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65     nMax = sqlite
1f090 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1f0a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1f0b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1f0c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1f0d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1f0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f0f0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f110 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
1f120 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
1f130 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
1f140 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
1f150 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1f160 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
1f170 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
1f180 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
1f190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f1a0 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
1f1b0 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43  || MEMDB || (noC
1f1c0 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
1f1d0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1f1e0 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  k) ){.      if( 
1f1f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
1f200 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
1f210 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f220 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1f230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1f240 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
1f250 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
1f260 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
1f270 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f280 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1f290 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e  dRead = noConten
1f2a0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c  t && !pPager->al
1f2b0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20  waysRollback;.  
1f2c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
1f2d0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
1f2e0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1f2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f300 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1f310 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29  ager, pPg, pgno)
1f320 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f330 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1f340 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1f350 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1f360 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
1f370 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
1f380 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1f390 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1f3a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f3b0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
1f3c0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
1f3d0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61    /* Link the pa
1f3e0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
1f3f0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
1f400 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70     h = pgno & (p
1f410 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
1f420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
1f430 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  o!=0 );.    pPg-
1f440 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
1f450 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
1f460 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
1f470 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  [h] = pPg;.    i
1f480 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
1f490 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  h ){.      asser
1f4a0 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
1f4b0 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  h->pPrevHash==0 
1f4c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  );.      pPg->pN
1f4d0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
1f4e0 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
1f4f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f500 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1f510 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1f520 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1f530 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
1f540 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
1f550 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
1f560 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1f570 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
1f580 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  t(pPager->nRef>0
1f590 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20   || pgno==1);.  
1f5a0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1f5b0 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
1f5c0 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29  if( !noContent )
1f5d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1f5e0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
1f5f0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1f600 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
1f610 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f620 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 72      }.    page_r
1f630 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  ef(pPg);.  }.  *
1f640 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
1f650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f660 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ;.}.int sqlite3P
1f670 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1f680 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1f690 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1f6a0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1f6b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1f6c0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1f6d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1f6e0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1f6f0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1f700 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1f710 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1f720 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1f730 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1f740 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1f750 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1f760 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1f770 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
1f780 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
1f790 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
1f7a0 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70 50   pagerAcquire(pP
1f7b0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
1f7c0 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
1f7d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1f7e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1f7f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  c;.}.../*.** Acq
1f800 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
1f810 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
1f820 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1f830 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
1f840 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
1f850 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
1f860 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f870 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
1f880 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1f890 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
1f8a0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
1f8b0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
1f8c0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1f8d0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1f8e0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
1f8f0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
1f900 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
1f910 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
1f920 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
1f930 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
1f940 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1f950 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
1f960 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1f970 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1f980 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1f990 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
1f9a0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
1f9b0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
1f9c0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
1f9d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1f9e0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1f9f0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1fa00 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
1fa10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fa20 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1fa30 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1fa40 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1fa50 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
1fa60 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1fa70 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  NLOCK ){.    ass
1fa80 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41  ert( !pPager->pA
1fa90 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  ll || pPager->ex
1faa0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
1fab0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1fac0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1fad0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1fae0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1faf0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
1fb00 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  */.  }else if( (
1fb10 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1fb20 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1fb30 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  )!=0 ){.    page
1fb40 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
1fb50 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1fb60 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  er);.  return pP
1fb70 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
1fb80 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
1fb90 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
1fba0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1fbb0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
1fbc0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
1fbd0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
1fbe0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
1fbf0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
1fc00 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
1fc10 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
1fc20 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
1fc30 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
1fc40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fc50 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
1fc60 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1fc70 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
1fc80 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1fc90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1fca0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
1fcb0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
1fcc0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1fcd0 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
1fce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1fcf0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67 65  nRef>0 );.  page
1fd00 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
1fd10 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  er);.  pPg->nRef
1fd20 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
1fd30 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  g);..  CHECK_PAG
1fd40 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
1fd50 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
1fd60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1fd70 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
1fd80 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
1fd90 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
1fda0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1fdb0 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
1fdc0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
1fdd0 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73  0 ){..    lruLis
1fde0 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20 69  tAdd(pPg);.    i
1fdf0 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1fe00 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1fe10 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1fe20 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1fe30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1fe40 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1fe50 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1fe60 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1fe70 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1fe80 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1fe90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1feb0 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1fec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fed0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1fee0 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1fef0 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1ff00 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1ff10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ff20 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1ff30 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1ff40 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1ff50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
1ff60 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1ff70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ff80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
1ff90 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
1ffa0 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
1ffb0 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
1ffc0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
1ffd0 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
1ffe0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1fff0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
20000 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
20010 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
20020 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20030 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
20040 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
20050 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
20060 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
20070 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
20080 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
20090 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
200a0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
200b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
200c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
200d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
200e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  .  int flags = (
200f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
20100 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
20110 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
20120 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
20130 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ..  int rc;.  as
20140 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
20150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20160 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
20170 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
20180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
20190 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
201a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
201b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
201c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
201d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
201e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
201f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20200 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
20210 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
20220 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
20230 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
20240 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
20250 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67  e/8 + 1 );.  pag
20260 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20270 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
20280 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
20290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
202a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
202b0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
202c0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  ournal;.  }..  i
202d0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
202e0 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  ile ){.    flags
202f0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
20300 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
20310 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20320 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73  JOURNAL);.  }els
20330 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e{.    flags |= 
20340 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
20350 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a  N_JOURNAL);.  }.
20360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20370 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
20380 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  E.  rc = sqlite3
20390 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
203a0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
203b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
203c0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
203d0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
203e0 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65  ager).  );.#else
203f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20400 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
20410 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
20420 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
20430 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  , 0);.#endif.  a
20440 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20450 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
20460 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
20470 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20480 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
20490 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
204a0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
204b0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
204c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
204d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
204e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
204f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
20500 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
20510 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
20520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
20530 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
20540 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
20550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20560 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
20570 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
20580 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
20590 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
205a0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
205b0 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
205c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
205d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
205e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
205f0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
20600 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
20610 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
20620 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
20630 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
20640 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20650 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
20660 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
20670 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
20680 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
20690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
206a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
206b0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
206c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
206d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
206e0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
206f0 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
20700 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
20710 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
20720 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20730 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
20740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20750 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20760 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
20770 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20780 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
20790 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
207a0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
207b0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
207c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
207d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
207e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
207f0 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
20800 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20810 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
20820 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
20830 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
20840 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
20850 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
20860 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20870 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
20880 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
20890 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
208a0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
208b0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
208c0 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
208d0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
208e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
208f0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
20900 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
20910 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
20920 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
20930 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
20940 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
20950 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
20960 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
20970 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
20980 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
20990 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
209a0 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
209b0 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
209c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
209d0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
209e0 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
209f0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
20a00 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
20a10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
20a30 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
20a40 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
20a50 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
20a60 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
20a70 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
20a80 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
20a90 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20aa0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
20ab0 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
20ac0 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
20ad0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
20ae0 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
20af0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
20b00 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
20b10 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
20b20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20b30 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
20b40 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
20b50 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
20b60 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
20b70 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
20b80 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20b90 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
20ba0 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
20bb0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20bc0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
20bd0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
20be0 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
20bf0 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
20c00 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
20c10 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
20c20 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
20c30 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
20c40 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
20c50 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
20c60 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
20c70 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
20c80 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
20c90 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
20ca0 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
20cb0 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
20cc0 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
20cd0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20ce0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
20cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61   SQLITE_OK;.  pa
20d00 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
20d10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
20d20 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
20d30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20d40 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
20d50 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
20d60 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
20d70 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
20d80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
20d90 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
20da0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
20db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
20dc0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
20dd0 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
20de0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20df0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20e00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20e20 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
20e30 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
20e40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20e70 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
20e80 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
20e90 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
20ea0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
20eb0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
20ec0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
20ed0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
20ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20ef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20f00 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c  {.        pagerL
20f10 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
20f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20f40 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20f50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
20f60 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
20f70 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
20f80 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20f90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
20fa0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
20fb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20fd0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
20fe0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
20ff0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
21000 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
21010 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
21020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21030 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
21040 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
21050 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
21060 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
21070 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
21080 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
21090 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
210a0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
210b0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
210c0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
210d0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
210e0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
210f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21100 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
21110 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
21120 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
21130 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
21140 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21150 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
21160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
21170 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
21180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21190 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
211a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
211b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
211c0 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
211d0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
211e0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
211f0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
21200 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
21210 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
21220 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65  );.    pagerEnte
21230 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
21240 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
21250 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
21260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21270 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
21280 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
21290 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
212a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
212b0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
212c0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
212d0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
212e0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
212f0 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
21300 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
21310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21320 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
21330 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
21350 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
21360 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
21370 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
21380 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
21390 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
213a0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
213b0 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
213c0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
213d0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
213e0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
213f0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
21400 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
21410 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
21420 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
21430 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
21440 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
21450 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
21460 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
21470 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
21480 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
21490 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
214a0 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
214b0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
214c0 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
214d0 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
214e0 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
214f0 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
21500 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
21510 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
21520 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
21530 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
21540 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
21550 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
21560 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
21570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
21580 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
21590 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
215a0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
215b0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
215c0 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
215d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
215e0 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
215f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
21600 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
21610 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
21620 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
21630 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  ty->pDirty = pPg
21640 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
21650 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21660 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
21670 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
21680 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
21690 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
216a0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
216b0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
216c0 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
216d0 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
216e0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
216f0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
21700 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
21710 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
21720 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
21730 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
21740 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
21750 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
21760 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
21770 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
21780 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
21790 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
217a0 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
217b0 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
217c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
217d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
217e0 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
217f0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
21800 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
21810 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
21820 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
21830 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
21840 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
21850 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
21860 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
21870 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
21880 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
21890 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
218a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
218b0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
218c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
218d0 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
218e0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
218f0 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
21900 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
21910 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
21920 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
21930 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
21940 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
21950 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
21960 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
21970 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
21980 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
21990 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
219a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
219b0 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
219c0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
219d0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
219e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
219f0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
21a00 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
21a10 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
21a20 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
21a30 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21a40 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
21a50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21a60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
21a70 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
21a80 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
21a90 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
21aa0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
21ab0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
21ac0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
21ad0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21ae0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
21af0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
21b00 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
21b10 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
21b20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
21b30 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
21b40 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
21b50 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
21b60 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
21b70 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
21b80 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
21b90 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
21ba0 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
21bb0 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
21bc0 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
21bd0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
21be0 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
21bf0 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
21c00 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
21c10 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
21c20 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
21c30 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
21c40 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
21c50 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
21c60 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
21c70 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
21c80 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
21c90 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
21ca0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
21cb0 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
21cc0 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
21cd0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
21ce0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
21cf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21d00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21d10 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
21d20 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
21d30 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
21d40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
21d50 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
21d60 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
21d70 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
21d80 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
21d90 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
21da0 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
21db0 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53  rnal && (pageInS
21dc0 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
21dd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
21de0 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
21df0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21e00 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
21e10 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
21e20 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
21e30 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
21e40 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
21e50 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
21e60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21e70 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
21e80 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
21e90 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
21ea0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21eb0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
21ec0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
21ed0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21ee0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
21ef0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
21f00 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
21f10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21f20 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
21f30 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
21f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21f50 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
21f60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21f90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
21fa0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21fb0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
21fc0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
21fd0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
21fe0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
21ff0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
22000 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
22010 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
22020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22030 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
22040 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22050 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
22060 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
22070 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
22080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
22090 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
220a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
220b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
220c0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
220d0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
220e0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
220f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
22100 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
22110 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
22120 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
22130 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
22140 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
22150 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
22160 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
22170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
22180 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
22190 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
221a0 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
221b0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
221c0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
221d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
221e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  ){.        if( M
221f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
22200 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
22210 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
22220 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
22230 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
22240 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
22250 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
22260 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22270 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
22290 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
222a0 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
222b0 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
222c0 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
222d0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
222e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 48 69          if( !pHi
222f0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
22300 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
22310 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22330 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
22340 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
22350 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
22360 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22370 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22380 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
22390 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  um;.          ch
223a0 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
223b0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
223c0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
223d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
223e0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
223f0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
22400 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
22410 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
22420 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
22430 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
22440 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
22450 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
22460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22470 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
22480 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
22490 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
224a0 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
224b0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
224c0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
224d0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
224e0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
224f0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
22500 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22510 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22520 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
22530 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
22540 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  no);.          i
22550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22570 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
22580 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
22590 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
225a0 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
225d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
225e0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
225f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22600 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
22610 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
22620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
22650 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
22660 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
22670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22680 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
22690 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
226a0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
226b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
226c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
226d0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
226e0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
226f0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
22710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22720 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
22730 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze));.          
22740 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
22750 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
22760 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
22770 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a    PAGERTRACE5("J
22780 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
22790 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
227a0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
227b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
227c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
227d0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
227e0 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67  dSync, pager_pag
227f0 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20  ehash(pPg));..  
22800 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
22810 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
22820 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
22830 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
22840 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
22850 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
22860 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
22870 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
22880 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
22890 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
228a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
228b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
228c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
228d0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
228e0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
228f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22900 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
22910 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
22920 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
22930 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
22940 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
22950 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
22960 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
22970 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
22980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22990 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
229a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
229b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
229c0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
229d0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
229e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
229f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
22a10 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
22a20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
22a30 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
22a40 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
22a50 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
22a60 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
22a70 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
22a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22a90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22aa0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
22ab0 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
22ac0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
22ad0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
22ae0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22af0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
22b00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
22b10 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
22b20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
22b30 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
22b40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
22b50 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
22b60 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
22b70 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
22b80 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
22b90 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
22ba0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
22bb0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
22bc0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
22bd0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
22be0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
22bf0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
22c00 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
22c10 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
22c20 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
22c30 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
22c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22c50 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
22c60 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
22c70 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
22c80 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
22c90 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
22ca0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
22cb0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
22cc0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
22cd0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
22ce0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
22cf0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
22d00 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
22d10 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
22d20 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
22d30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
22d40 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
22d50 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
22d60 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
22d70 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
22d80 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
22d90 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
22da0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
22db0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
22dc0 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
22dd0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
22de0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
22df0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
22e00 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
22e10 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
22e20 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
22e30 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
22e40 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
22e50 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
22e60 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
22e70 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
22e80 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66  .        i64 off
22e90 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
22ea0 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
22eb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
22ec0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
22ed0 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
22ee0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
22ef0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
22f00 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
22f10 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  s(pPager->stfd, 
22f20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
22f30 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
22f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22f50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22f60 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
22f70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
22f80 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
22f90 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
22fa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22fb0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
22fc0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
22fd0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
22fe0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22ff0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
23040 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
23050 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
23060 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
23070 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
23080 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
23090 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
230a0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
230b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
230c0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
230d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
230e0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
230f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
23100 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
23110 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
23120 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
23130 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
23140 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23150 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
23160 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
23170 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
23180 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
23190 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
231a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
231b0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
231c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
231d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
231e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
231f0 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
23200 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
23210 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
23220 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
23230 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
23240 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
23250 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
23260 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
23270 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
23280 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
23290 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
232a0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
232b0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
232c0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
232d0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
232e0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
232f0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
23300 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
23310 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
23320 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
23330 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
23340 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
23350 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
23360 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
23370 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
23380 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
23390 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
233a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
233b0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
233c0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
233d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
233e0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
233f0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
23400 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
23410 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
23420 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
23430 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
23440 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
23450 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72  eSize);..  pager
23460 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
23470 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
23480 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
23490 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
234a0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
234b0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
234c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
234d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
234e0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
234f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23500 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
23510 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
23520 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
23530 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
23540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
23560 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
23570 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
23580 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
23590 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
235a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
235b0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
235c0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
235d0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
235e0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
235f0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
23600 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
23610 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
23620 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
23630 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
23640 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23650 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
23660 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
23670 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
23680 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
23690 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
236a0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
236b0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
236c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
236d0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
236e0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
236f0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
23700 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
23710 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
23720 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
23730 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
23740 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
23750 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
23760 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
23770 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
23780 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
23790 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
237a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
237b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
237c0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
237d0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
237e0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
237f0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
23800 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
23810 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
23820 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
23830 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
23840 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
23850 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
23860 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
23870 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23880 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
23890 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
238a0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
238b0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
238c0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
238d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
238e0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
238f0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
23900 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
23910 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
23920 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
23930 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
23940 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d  rnal || pg==pPg-
23950 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20  >pgno || .      
23960 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f      pg>pPager->o
23970 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70  rigDbSize || !(p
23980 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
23990 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26  l[pg/8]&(1<<(pg&
239a0 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20  7))).      ) {. 
239b0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
239c0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
239d0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
239e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
239f0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
23a00 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
23a10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23a30 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
23a40 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
23a50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23a60 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
23a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23a80 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
23a90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23aa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23ab0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
23ac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
23ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23ae0 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
23af0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
23b00 50 61 67 65 72 2c 20 70 67 29 29 20 29 7b 0a 20  Pager, pg)) ){. 
23b10 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
23b20 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
23b30 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
23b40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
23b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23b60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48     /* If the PgH
23b70 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
23b80 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
23b90 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
23ba0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
23bb0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
23bc0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
23bd0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
23be0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
23bf0 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
23c00 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
23c10 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
23c20 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
23c30 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
23c40 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
23c50 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
23c60 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
23c70 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
23c80 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
23c90 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
23ca0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23cb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
23cc0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b   if( needSync ){
23cd0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
23ce0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65   ii<nPage && nee
23cf0 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  dSync; ii++){.  
23d00 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
23d10 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
23d20 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
23d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
23d40 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e 65  Page ) pPage->ne
23d50 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
23d60 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23d70 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
23d80 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
23d90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23da0 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
23db0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23dc0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
23dd0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
23de0 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
23df0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
23e00 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
23e10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23e20 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
23e30 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
23e40 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
23e50 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
23e60 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
23e70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
23e80 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
23e90 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
23ea0 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
23eb0 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
23ec0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
23ed0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
23ee0 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
23ef0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
23f00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
23f10 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
23f20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
23f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
23f40 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
23f50 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
23f60 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
23f70 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
23f80 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
23f90 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
23fa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23fb0 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67  gerOverwrite(Pag
23fc0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
23fd0 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61   pgno, void *pDa
23fe0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
23ff0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
24000 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
24010 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
24020 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
24030 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a  r, pgno, &pPg);.
24040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24050 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
24060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24070 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
24080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24090 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71  .      memcpy(sq
240a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
240b0 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70  a(pPg), pData, p
240c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
240d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
240e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
240f0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  g);.  }.  pagerL
24100 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
24110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
24120 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
24130 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
24140 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
24150 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
24160 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
24170 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
24180 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
24190 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
241a0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
241b0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
241c0 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
241d0 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
241e0 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
241f0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
24200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
24210 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
24220 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
24230 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
24240 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
24250 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
24260 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
24270 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
24280 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
24290 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
242a0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
242b0 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
242c0 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
242d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
242e0 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  Rollback() below
242f0 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
24300 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
24310 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
24320 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
24330 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
24340 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
24350 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
24360 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24370 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
24380 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
24390 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
243a0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
243b0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
243c0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
243d0 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
243e0 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
243f0 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
24400 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
24410 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
24420 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
24430 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
24440 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
24450 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
24460 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
24470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
24480 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
24490 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
244a0 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
244b0 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
244c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
244d0 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
244e0 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
244f0 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
24500 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
24510 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
24520 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
24530 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
24540 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ** the sqlite3Pa
24550 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24560 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
24570 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
24580 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  e the.** page co
24590 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20  ntains critical 
245a0 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
245b0 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
245c0 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64  t gets.** rolled
245d0 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f   back in spite o
245e0 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  f the sqlite3Pag
245f0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
24600 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
24610 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
24620 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
24630 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
24640 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
24650 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
24660 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
24670 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
24680 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  urn;.  pagerEnte
24690 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  r(pPager);.  pPg
246a0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
246b0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
246c0 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
246d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
246e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
246f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
24700 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
24710 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
24720 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
24730 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
24740 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
24750 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
24760 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
24770 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
24780 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
24790 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
247a0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
247b0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
247c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
247d0 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
247e0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
247f0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
24800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24810 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
24820 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24830 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
24840 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
24850 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
24860 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
24870 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
24880 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
24890 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
248a0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
248b0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
248c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
248d0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
248e0 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
248f0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
24900 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
24910 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
24920 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
24930 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
24940 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
24950 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
24960 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
24970 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
24980 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
24990 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
249a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
249b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
249c0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
249d0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
249e0 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
249f0 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
24a00 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
24a10 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
24a20 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
24a30 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
24a40 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  f.    }.  }.  pa
24a50 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
24a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  ;.}../*.** A cal
24a70 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
24a80 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
24a90 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
24aa0 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
24ab0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
24ac0 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
24ad0 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
24ae0 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
24af0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
24b00 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
24b10 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
24b20 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
24b30 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
24b40 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ck journal..**.*
24b50 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
24b60 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65   yet actually re
24b70 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
24b80 66 20 74 68 69 73 20 70 61 67 65 20 28 69 66 0a  f this page (if.
24b90 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ** the PgHdr.nee
24ba0 64 52 65 61 64 20 66 6c 61 67 20 69 73 20 73 65  dRead flag is se
24bb0 74 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t) then this rou
24bc0 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 70  tine acts as a p
24bd0 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77  romise.** that w
24be0 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65  e will never nee
24bf0 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  d to read the pa
24c00 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  ge content in th
24c10 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20  e future..** so 
24c20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61  the needRead fla
24c30 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  g can be cleared
24c40 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
24c50 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24c60 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
24c70 64 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  d from a single 
24c80 70 6c 61 63 65 20 69 6e 20 74 68 65 20 73 71 6c  place in the sql
24c90 69 74 65 20 62 74 72 65 65 0a 2a 2a 20 63 6f 64  ite btree.** cod
24ca0 65 20 28 77 68 65 6e 20 61 20 6c 65 61 66 20 69  e (when a leaf i
24cb0 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
24cc0 68 65 20 66 72 65 65 2d 6c 69 73 74 29 2e 20 54  he free-list). T
24cd0 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a 2a  his allows the.*
24ce0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 75  * following assu
24cf0 6d 70 74 69 6f 6e 73 20 74 6f 20 62 65 20 6d 61  mptions to be ma
24d00 64 65 20 61 62 6f 75 74 20 70 50 67 3a 0a 2a 2a  de about pPg:.**
24d10 0a 2a 2a 20 20 20 31 2e 20 50 61 67 65 72 44 6f  .**   1. PagerDo
24d20 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65  ntWrite() has be
24d30 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
24d40 20 70 61 67 65 2c 20 4f 52 20 0a 2a 2a 20 20 20   page, OR .**   
24d50 20 20 20 50 61 67 65 72 57 72 69 74 65 28 29 20     PagerWrite() 
24d60 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
24d70 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
24d80 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  age..**.**   2. 
24d90 54 68 65 20 70 61 67 65 20 65 78 69 73 74 65 64  The page existed
24da0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
24db0 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
24dc0 64 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  d..**.** Details
24dd0 3a 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  : DontRollback()
24de0 20 28 74 68 69 73 20 72 6f 75 74 69 6e 65 29 20   (this routine) 
24df0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 77  is only called w
24e00 68 65 6e 20 61 20 6c 65 61 66 20 69 73 0a 2a 2a  hen a leaf is.**
24e10 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
24e20 65 20 66 72 65 65 20 6c 69 73 74 2e 20 44 6f 6e  e free list. Don
24e30 74 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  tWrite() is call
24e40 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 70 61  ed whenever a pa
24e50 67 65 20 0a 2a 2a 20 62 65 63 6f 6d 65 73 20 61  ge .** becomes a
24e60 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
24e70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24e80 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
24e90 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  k(DbPage *pPg){.
24ea0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
24eb0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
24ec0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
24ed0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
24ee0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
24ef0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
24f00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
24f10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
24f20 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57  t open, or DontW
24f30 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20  rite() has been 
24f40 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74  called on.  ** t
24f50 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72  his page (DontWr
24f60 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20 61  ite() sets the a
24f70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
24f80 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20  ag), then this. 
24f90 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20   ** function is 
24fa0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
24fb0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
24fc0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50  nalOpen==0 || pP
24fd0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
24fe0 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
24ff0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
25000 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
25010 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
25020 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
25030 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a   !MEMDB );    /*
25040 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50   For a memdb, pP
25050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
25060 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f  n is always 0 */
25070 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
25080 74 20 50 61 67 65 72 57 72 69 74 65 28 29 20 68  t PagerWrite() h
25090 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
250a0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70  called on this p
250b0 61 67 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68  age, and.  ** th
250c0 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
250d0 74 65 64 20 77 68 65 6e 20 74 68 65 20 74 72 61  ted when the tra
250e0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
250f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25100 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
25110 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
25120 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
25130 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61  igDbSize );..  a
25140 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
25150 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
25160 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
25170 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
25180 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
25190 6e 6f 26 37 29 3b 0a 20 20 70 50 67 2d 3e 69 6e  no&7);.  pPg->in
251a0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70  Journal = 1;.  p
251b0 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
251c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
251d0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
251e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
251f0 3e 73 74 6d 74 53 69 7a 65 20 3c 3d 20 70 50 61  >stmtSize <= pPa
25200 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
25210 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
25220 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
25230 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
25240 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20 20 50  pgno&7);.  }.  P
25250 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
25260 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
25270 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
25280 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
25290 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
252a0 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20  CE(("GARBAGE %p 
252b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
252c0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67  Pg->pgno)).  pag
252d0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
252e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
252f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25300 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
25310 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25320 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
25330 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
25340 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
25350 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
25360 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
25370 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
25380 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25390 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20  nt isDirect){.  
253a0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
253b0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
253c0 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ter;.  int rc = 
253d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
253e0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
253f0 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
25400 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
25410 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
25420 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
25430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25440 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
25450 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
25460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25470 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
25480 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74     if( !isDirect
25490 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
254a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
254b0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
254c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
254d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
254e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
254f0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20  PgHdr);.        
25500 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
25510 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25520 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
25530 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
25540 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
25550 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
25560 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
25570 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
25580 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
25590 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
255a0 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
255b0 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69  r++;.    put32bi
255c0 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52  ts(((char*)PGHDR
255d0 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
255e0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
255f0 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20  nter);..    if( 
25600 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67  isDirect && pPag
25610 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
25620 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
25630 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50 47 48  void *zBuf = PGH
25640 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
25650 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
25660 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
25670 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
25680 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25690 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
256a0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
256b0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
256c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
256d0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
256e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
256f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
25700 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
25710 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
25720 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
25730 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
25740 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
25750 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
25760 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
25770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25780 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
25790 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
257a0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
257b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
257c0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
257d0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
257e0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
257f0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
25800 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
25810 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
25820 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
25830 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
25840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
25850 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
25860 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
25870 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
25880 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
25890 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
258a0 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
258b0 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
258c0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
258d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
258e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
258f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
25900 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
25910 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
25920 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
25930 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
25940 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
25950 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
25960 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
25970 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
25980 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25990 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
259a0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
259b0 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
259c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
259d0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
259e0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
259f0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
25a00 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
25a10 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
25a20 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
25a30 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
25a40 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20  tPhaseOne(Pager 
25a50 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
25a60 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
25a70 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
25a80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25a90 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  ;..  PAGERTRACE4
25aa0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
25ab0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
25ac0 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
25ad0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
25ae0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
25af0 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ter, nTrunc);.  
25b00 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
25b10 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  r);..  /* If thi
25b20 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
25b30 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
25b40 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
25b50 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
25b60 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
25b70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
25b80 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
25b90 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
25ba0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
25bb0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
25bc0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
25bd0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
25be0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
25bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25c00 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
25c10 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  TE.    /* The at
25c20 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
25c30 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
25c40 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  sed if all of th
25c50 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
25c60 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
25c70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
25c80 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
25c90 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
25ca0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
25cb0 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20  ty for.    **   
25cc0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
25cd0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
25ce0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69  .    **    + Thi
25cf0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
25d00 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
25d10 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
25d20 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
25d30 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  + Exactly one pa
25d40 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
25d50 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
25d60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25d70 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
25d80 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
25d90 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
25da0 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  d, then the jour
25db0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
25dc0 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72  ver.    ** be cr
25dd0 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
25de0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
25df0 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  */.    int useAt
25e00 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
25e10 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
25e20 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
25e30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
25e40 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
25e50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20  ager) && .      
25e60 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a    nTrunc==0 && .
25e70 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67          (0==pPag
25e80 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d  er->pDirty || 0=
25e90 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d  =pPager->pDirty-
25ea0 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a  >pDirty).    );.
25eb0 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
25ec0 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
25ed0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
25ee0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
25ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
25f00 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
25f10 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
25f20 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
25f30 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
25f40 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
25f50 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
25f60 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
25f70 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
25f80 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
25f90 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
25fa0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
25fb0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
25fc0 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
25fd0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
25fe0 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
25ff0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
26000 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
26010 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
26020 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
26030 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
26040 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
26050 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
26060 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
26070 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
26080 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
26090 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
260a0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
260b0 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
260c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
260d0 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
260e0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
260f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26100 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26110 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
26120 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
26130 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
26150 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
26160 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
26170 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
26180 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
26190 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
261a0 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
261b0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
261c0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
261d0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
261e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
261f0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
26200 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
26210 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
26220 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
26230 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
26240 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
26250 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
26260 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
26270 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
26280 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
26290 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
262a0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
262b0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
262c0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
262d0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
262e0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
262f0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
26300 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
26310 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
26320 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  ster ){.      as
26330 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
26340 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
26350 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
26360 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
26370 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
26380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26390 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
263a0 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
263b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
263c0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
263d0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
263e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
263f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
26400 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
26410 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
26420 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
26430 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
26440 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
26450 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
26460 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
26470 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
26480 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
26490 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
264a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53  ;.        int iS
264b0 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
264c0 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20  GNO(pPager);.   
264d0 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
264e0 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
264f0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
26500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26510 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ( !(pPager->aInJ
26520 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31  ournal[i/8] & (1
26530 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d  <<(i&7))) && i!=
26540 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
26550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26560 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
26570 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
26580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26590 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
265a0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
265b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
265c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
265d0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
265e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
265f0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
26600 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26610 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26620 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
26630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
26640 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26650 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
26660 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
26670 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
26680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26690 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
266a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
266b0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
266c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
266d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
266e0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
266f0 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20  _exit;..#ifndef 
26700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26710 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
26720 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
26730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26740 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
26750 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
26760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26770 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26780 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
26790 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
267a0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
267b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
267c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
267d0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
267e0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
267f0 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
26800 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
26810 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
26820 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26830 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
26840 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e 64 69   pPg && !pPg->di
26850 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70 50 67  rty ){ pPg = pPg
26860 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20 20 20  ->pDirty; }.    
26870 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
26880 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 67 6f   = pPg;.      go
26890 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
268a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
268b0 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20  pDirty = 0;..   
268c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
268d0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
268e0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
268f0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
26900 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26910 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
26920 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
26930 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
26940 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
26950 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
26960 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
26970 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
26980 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
26990 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
269a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
269b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
269c0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
269d0 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
269e0 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
269f0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
26a00 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
26a10 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
26a20 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
26a30 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
26a40 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a  exclusive.     *
26a50 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
26a60 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
26a70 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
26a80 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
26a90 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f     * there is no
26aa0 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
26ab0 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
26ac0 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20  t, it is.     * 
26ad0 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
26ae0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
26af0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
26b00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
26b10 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
26b20 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
26b30 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
26b40 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
26b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
26b60 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
26b70 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
26b80 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
26b90 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
26ba0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
26bb0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
26bc0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
26bd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
26be0 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
26bf0 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
26c00 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
26c10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
26c20 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26c30 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
26c40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
26c50 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
26c60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
26c70 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
26c80 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
26c90 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
26ca0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
26cb0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
26cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26cd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67  ERROR;.  }.  pag
26ce0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
26cf0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
26d00 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
26d10 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
26d20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
26d30 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
26d40 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
26d50 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
26d60 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
26d70 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
26d80 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
26d90 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
26da0 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  );.      clearHi
26db0 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
26dc0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
26dd0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
26de0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26df0 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
26e00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
26e10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
26e20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
26e30 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
26e40 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
26e50 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
26e60 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
26e70 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
26e80 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44   = 0;.#ifndef ND
26e90 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
26ea0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
26eb0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
26ec0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
26ed0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
26ee0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
26ef0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
26f00 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
26f10 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
26f20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26f30 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
26f40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26f50 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
26f60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
26f70 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
26f80 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26f90 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
26fa0 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65 72  HARED;.    pager
26fb0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
26fc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26fd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
26fe0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
26ff0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
27000 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
27010 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27020 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
27030 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
27040 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
27050 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
27060 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
27070 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
27080 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
27090 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65  , rc);.  pagerLe
270a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
270b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
270c0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
270d0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
270e0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
270f0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
27100 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
27110 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
27120 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
27130 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
27140 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
27150 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
27160 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
27170 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
27180 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
27190 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
271a0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
271b0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
271c0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
271d0 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  l or unless some
271e0 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
271f0 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
27200 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
27210 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
27220 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
27230 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
27240 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
27250 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
27260 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
27270 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
27280 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
27290 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
272a0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
272b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
272c0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
272d0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
272e0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
272f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
27300 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c  AGERTRACE2("ROLL
27310 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
27320 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
27330 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
27340 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
27350 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
27360 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
27370 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
27380 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
27390 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
273a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
273b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
273c0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
273d0 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
273e0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
273f0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
27400 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
27410 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
27420 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
27430 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
27440 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
27450 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
27460 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
27470 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
27480 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
27490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
274a0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
274b0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
274c0 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
274d0 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
274e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
274f0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27500 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
27510 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
27520 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
27530 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
27540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41  else{.        PA
27550 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20  GERTRACE3("PAGE 
27560 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25  %d is clean on %
27570 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
27580 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
27590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
275a0 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
275b0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
275c0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
275d0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
275e0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
275f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
27600 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
27610 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
27620 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
27630 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
27640 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
27650 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
27660 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  (p, pPager->page
27670 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
27680 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
27690 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
276a0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
276b0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
276c0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
276d0 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
276e0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
276f0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
27700 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
27710 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
27720 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
27730 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
27740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27750 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e  ;.  }..  pagerEn
27760 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
27770 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
27780 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
27790 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
277a0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
277b0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
277c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61  (pPager);.    pa
277d0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
277e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
277f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
27800 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
27810 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
27820 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
27830 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
27840 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
27850 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
27860 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
27870 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
27880 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
27890 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
278a0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
278b0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
278c0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
278d0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
278e0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
278f0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
27900 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
27910 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
27920 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
27930 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
27940 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
27960 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
27970 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
27980 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
27990 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61   0);.  }.  /* pa
279a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
279b0 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
279c0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
279d0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
279e0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
279f0 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
27a00 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
27a10 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
27a20 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
27a30 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
27a40 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
27a50 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
27a60 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
27a70 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
27a80 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
27a90 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
27aa0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
27ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27ac0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
27ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27ae0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
27af0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
27b00 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
27b10 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
27b20 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
27b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27b40 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
27b50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27b60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
27b70 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
27b80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
27b90 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
27ba0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
27bb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27bc0 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
27bd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
27be0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65  turn pPager->nRe
27bf0 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  f;.}..#ifdef SQL
27c00 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
27c10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
27c20 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
27c30 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
27c40 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
27c50 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
27c60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
27c70 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
27c80 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
27c90 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
27ca0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
27cb0 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
27cc0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
27cd0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
27ce0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
27cf0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
27d00 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
27d10 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
27d20 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
27d30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
27d40 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
27d50 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
27d60 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
27d70 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
27d80 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
27d90 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
27da0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
27db0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
27dc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
27dd0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
27de0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27df0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
27e00 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
27e10 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
27e20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
27e30 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
27e40 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
27e50 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
27e60 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
27e70 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
27e80 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
27e90 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
27ea0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
27eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27ec0 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  pagerStmtBegin(P
27ed0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27ee0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
27ef0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
27f00 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
27f10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27f20 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
27f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27f40 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
27f50 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
27f60 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
27f70 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27f80 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
27f90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
27fa0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
27fb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
27fc0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
27fd0 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
27fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27ff0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
28000 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
28010 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
28020 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
28030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28050 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
28060 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  en );.  pagerLea
28070 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ve(pPager);.  as
28080 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
28090 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  nStmt==0 );.  pP
280a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
280b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
280c0 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
280d0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70 61 67  e/8 + 1 );.  pag
280e0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
280f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
28100 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
28110 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
28120 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
28130 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
28140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28150 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
28160 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
28170 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
28180 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
28190 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
281a0 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
281b0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
281c0 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
281d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
281e0 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
281f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
28200 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
28210 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
28220 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28230 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
28240 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
28250 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
28260 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
28270 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
28280 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
28290 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
282a0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
282b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
282c0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
282d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
282e0 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50 61 67  ager->stfd, pPag
282f0 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20  er->zStmtJrnl,. 
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
28320 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
28330 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
28340 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
28350 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
28360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
28370 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
28380 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
28390 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
283a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
283b0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
283c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
283d0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
283e0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
283f0 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
28400 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28410 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
28420 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
28430 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
28440 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
28450 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
28460 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
28470 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28480 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28490 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
284a0 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
284b0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
284c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
284d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
284e0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
284f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
28500 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
28510 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28520 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28530 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
28540 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
28550 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
28560 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
28570 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
28580 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
28590 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
285a0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
285b0 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
285c0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
285d0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
285e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
285f0 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  free( pPager->aI
28600 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
28610 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
28620 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
28630 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
28640 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
28650 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
28660 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
28670 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
28680 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
28690 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  r);.        pNex
286a0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
286b0 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73  Stmt;.        as
286c0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53  sert( pHist->inS
286d0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  tmt );.        p
286e0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
286f0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
28700 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
28710 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
28720 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
28730 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
28740 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
28750 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
28760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28770 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
28780 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
28790 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
287a0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
287b0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
287c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
287d0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67  oopen = 0;.  pag
287e0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
287f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
28810 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
28820 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
28830 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
28840 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
28850 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28860 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28870 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
28880 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
28890 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
288a0 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
288b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
288c0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
288d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
288e0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
288f0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
28900 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
28910 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
28920 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70  Pg; pPg=pHist->p
28930 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
28940 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
28950 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
28960 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
28970 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
28980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
28990 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
289a0 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
289b0 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
289c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
289d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
289e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
289f0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
28a00 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
28a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28a20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
28a30 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
28a40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
28a50 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
28a60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28a90 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
28aa0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
28ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
28ac0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
28ad0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
28ae0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
28af0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
28b00 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
28b10 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65  open = 0;.  page
28b20 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
28b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28b40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
28b50 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
28b60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28b70 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
28b80 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
28b90 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
28ba0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28bb0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
28bc0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
28bd0 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
28be0 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
28bf0 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
28c00 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
28c10 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
28c20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
28c30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
28c40 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
28c50 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
28c60 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
28c70 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
28c80 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
28c90 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
28ca0 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
28cb0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
28cc0 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
28cd0 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
28ce0 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
28cf0 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
28d00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28d10 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
28d20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28d30 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
28d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28d50 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
28d60 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
28d70 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
28d80 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28d90 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
28da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28db0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
28dc0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
28dd0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
28de0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
28df0 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
28e00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28e10 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28e20 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
28e30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
28e40 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
28e50 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
28e60 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
28e70 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
28e80 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
28e90 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
28ea0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28eb0 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
28ec0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
28ed0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
28ee0 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
28ef0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
28f00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
28f10 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
28f20 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
28f30 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
28f40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28f50 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
28f60 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
28f70 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
28f80 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
28f90 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
28fa0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
28fb0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
28fc0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
28fd0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
28fe0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28ff0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
29000 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
29010 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
29020 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
29030 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
29040 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
29050 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
29060 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
29070 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
29080 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
29090 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
290a0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
290b0 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
290c0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
290d0 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  us located at pg
290e0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
290f0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
29100 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
29110 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
29120 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
29130 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
29140 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
29150 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
29160 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
29170 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
29180 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
29190 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
291a0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
291b0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
291c0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
291d0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
291e0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
291f0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
29200 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
29210 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
29220 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
29230 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
29240 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
29250 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
29260 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
29270 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
29280 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
29290 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
292a0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
292b0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
292c0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
292d0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
292e0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
292f0 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
29300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
29310 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
29320 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
29330 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
29340 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
29350 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ld;  /* The page
29360 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
29370 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a  en. */.  int h;.
29380 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
29390 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65  gno = 0;..  page
293a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
293b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
293c0 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
293d0 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
293e0 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
293f0 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
29400 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
29410 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29420 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
29430 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
29440 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
29450 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
29460 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
29470 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
29480 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
29490 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  );.  if( pPg->ne
294a0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
294b0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
294c0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
294d0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
294e0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e  al || (int)pgno>
294f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
29500 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
29510 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
29520 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29530 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
29540 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
29550 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61   pPg from its ha
29560 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
29570 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
29580 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
29590 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
295a0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
295b0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
295c0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
295d0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61    ** from its ha
295e0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
295f0 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
29600 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
29610 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
29620 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
29630 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
29640 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
29650 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
29660 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
29670 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
29680 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
29690 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
296a0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
296b0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
296c0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
296d0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
296e0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
296f0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
29700 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
29710 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
29720 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
29730 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e  Sync = pPgOld->n
29740 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65  eedSync;.  }else
29750 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  {.    pPg->needS
29760 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ync = 0;.  }.  i
29770 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
29780 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
29790 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
297a0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50  DbSize ){.    pP
297b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20  g->inJournal =  
297c0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
297d0 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  nal[pgno/8] & (1
297e0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b  <<(pgno&7)))!=0;
297f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
29800 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
29810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29820 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c  g->needSync==0 |
29830 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
29840 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
29850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  ;.  }..  /* Chan
29860 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
29870 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
29880 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
29890 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
298a0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
298b0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
298c0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
298d0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
298e0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
298f0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
29900 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
29910 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
29920 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
29930 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
29940 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
29950 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
29960 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
29970 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
29980 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
29990 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
299a0 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
299b0 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
299c0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
299d0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
299e0 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
299f0 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
29a00 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
29a10 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
29a20 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29a30 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
29a40 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
29a50 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
29a60 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
29a70 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
29a80 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
29a90 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
29aa0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
29ab0 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
29ac0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
29ad0 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49  .    ** Pager.aI
29ae0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
29af0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
29b00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
29b10 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
29b20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
29b30 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
29b40 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
29b50 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
29b60 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
29b70 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
29b80 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
29b90 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
29ba0 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
29bb0 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
29bc0 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
29bd0 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
29be0 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
29bf0 65 20 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e aInJournal[]. 
29c00 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
29c10 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
29c20 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
29c30 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
29c40 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
29c50 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
29c60 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
29c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29c80 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
29c90 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
29ca0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29cb0 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
29cc0 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
29cd0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
29ce0 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
29cf0 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
29d00 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
29d10 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
29d20 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
29d30 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
29d40 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
29d50 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
29d60 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
29d70 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
29d80 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
29d90 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
29da0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
29db0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29dc0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
29dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29de0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
29df0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
29e00 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
29e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29e20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
29e30 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
29e40 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
29e50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
29e60 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
29e70 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
29e80 75 72 6e 61 6c 5b 6e 65 65 64 53 79 6e 63 50 67  urnal[needSyncPg
29e90 6e 6f 2f 38 5d 20 26 3d 20 7e 28 31 3c 3c 28 6e  no/8] &= ~(1<<(n
29ea0 65 65 64 53 79 6e 63 50 67 6e 6f 26 37 29 29 3b  eedSyncPgno&7));
29eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
29ec0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
29ed0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29ee0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
29ef0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
29f00 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
29f10 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29f20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
29f30 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
29f40 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
29f50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29f60 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
29f70 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65   }..  pagerLeave
29f80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
29f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29fa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
29fb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
29fc0 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
29fd0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
29fe0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
29ff0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
2a000 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2a010 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
2a020 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
2a030 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
2a040 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
2a050 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
2a060 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
2a070 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
2a080 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
2a090 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
2a0a0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
2a0b0 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
2a0c0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
2a0d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a0e0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2a0f0 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54   (pPager?PGHDR_T
2a100 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
2a110 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger):0);.}../*.*
2a120 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
2a130 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
2a140 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
2a150 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
2a160 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
2a170 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
2a180 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
2a190 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2a1a0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
2a1b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2a1c0 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
2a1d0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
2a1e0 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
2a1f0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
2a200 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
2a210 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
2a220 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
2a230 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
2a240 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a250 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
2a260 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2a270 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
2a280 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
2a290 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
2a2a0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
2a2b0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
2a2c0 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
2a2d0 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
2a2e0 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
2a2f0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2a300 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2a310 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
2a320 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
2a330 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a340 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
2a350 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2a360 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2a370 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2a380 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2a390 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
2a3a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2a3b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2a3c0 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
2a3d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2a3e0 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
2a3f0 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
2a400 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2a410 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
2a420 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
2a430 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65   eMode;.  }.  re
2a440 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
2a450 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
2a460 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2a470 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69  E_TEST./*.** Pri
2a480 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
2a490 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
2a4a0 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
2a4b0 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
2a4c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
2a4d0 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
2a4e0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
2a4f0 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
2a500 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
2a510 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
2a520 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
2a530 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
2a540 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
2a550 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
2a560 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
2a570 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
2a580 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
2a590 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
2a5a0 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
2a5b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
2a5c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2a5d0 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.