/ Hex Artifact Content
Login

Artifact baf3c74d8add102e83bae06f34644e8a50f4928d:


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 34  : pager.c,v 1.44
0350: 39 20 32 30 30 38 2f 30 35 2f 32 30 20 30 37 3a  9 2008/05/20 07:
0360: 30 35 3a 30 39 20 64 61 6e 69 65 6c 6b 31 39 37  05:09 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0690: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
06a0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
06b0: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
06c0: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06d0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06e0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06f0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
0700: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
0710: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0720: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0730: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0740: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0750: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0760: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0770: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0790: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
07a0: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
07b0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07c0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07e0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
0800: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0810: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0820: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0840: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0850: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0860: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0890: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
08a0: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
08b0: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08c0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08f0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
0900: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0930: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0940: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0950: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0960: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0970: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0990: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
09a0: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
09b0: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09c0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09f0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
0a00: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
0a10: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a40: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a50: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a60: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a90: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0aa0: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ad0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ae0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0af0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b20: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b30: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b40: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b70: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b80: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0ba0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0bc0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bd0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0be0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0c10: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c20: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c30: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c40: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c50: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c60: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c80: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c90: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0ca0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cd0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0ce0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cf0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d10: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d20: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d30: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d90: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0da0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0db0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0dc0: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0dd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0de0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0df0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0e00: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0e10: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0e20: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e30: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e40: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e50: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e60: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e70: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e80: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e90: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0ea0: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0eb0: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0ec0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ed0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0ee0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ef0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f00: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f10: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f20: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f30: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f40: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f50: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f60: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f70: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f80: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f90: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0fa0: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0fb0: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0fc0: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fd0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fe0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0ff0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
1000: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1010: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
1020: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1030: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1050: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1060: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1070: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1080: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1090: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
10a0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
10b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
10c0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10d0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10e0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10f0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
1100: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
1110: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1130: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1140: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1150: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1160: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1170: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1180: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1190: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
11a0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
11b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
11c0: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11d0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
1200: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
1210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
1220: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1230: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1240: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1250: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1260: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1270: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1280: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1290: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
12a0: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
12b0: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
12c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12d0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12e0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12f0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
1300: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1310: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
1320: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1330: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1340: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1350: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1360: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1370: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1380: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1390: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
13a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13b0: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
13c0: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13d0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13e0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13f0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
1400: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
1410: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
1420: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1430: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1440: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1450: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1460: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1470: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1480: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1490: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
14a0: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
14b0: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
14c0: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14d0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14e0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1500: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
1510: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
1520: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1540: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1550: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1560: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1570: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1580: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1590: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
15a0: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
15b0: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
15c0: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15d0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15e0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15f0: 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66 20 73  )&~7)..typedef s
1600: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
1610: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 70  r;../*.** Each p
1620: 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c 6c 20  ager stores all 
1630: 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 66 65  currently unrefe
1640: 72 65 6e 63 65 64 20 70 61 67 65 73 20 69 6e 20  renced pages in 
1650: 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a 2a 2a  a list sorted.**
1660: 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65 6e 74   in least-recent
1670: 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20 6f 72  ly-used (LRU) or
1680: 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20 66 69  der (i.e. the fi
1690: 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  rst item on the 
16a0: 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e 6f 74  list has .** not
16b0: 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
16c0: 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d 65 2c   in a long time,
16d0: 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 68   the last item h
16e0: 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74 6c 79  as been recently
16f0: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20 69 6e  .** used). An in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1710: 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 63 6c  tructure is incl
1720: 75 64 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  uded as part of 
1730: 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20 73 74  each.** pager st
1740: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1750: 20 70 75 72 70 6f 73 65 20 28 76 61 72 69 61 62   purpose (variab
1760: 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e 0a 2a  le Pager.lru)..*
1770: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1780: 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  y, if memory-man
1790: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
17a0: 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ed, all unrefere
17b0: 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a 20 61  nced pages .** a
17c0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 67  re stored in a g
17d0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 20 28  lobal LRU list (
17e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
17f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1800: 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  st)..**.** In bo
1810: 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 50 61  th cases, the Pa
1820: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
1830: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
1840: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1850: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
1860: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1870: 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f 65 73  g list that does
1880: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 0a   not require an.
1890: 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61  ** fsync() opera
18a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 73 20  tion before its 
18b0: 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 72 65  memory can be re
18c0: 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e 6f 20 73  claimed. If no s
18d0: 75 63 68 0a 2a 2a 20 70 61 67 65 20 65 78 69 73  uch.** page exis
18e0: 74 73 2c 20 50 61 67 65 72 4c 72 75 4c 69 73 74  ts, PagerLruList
18f0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 69 73  .pFirstSynced is
1900: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
1910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1920: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50 61 67  PagerLruList Pag
1930: 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72 75 63  erLruList;.struc
1940: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 7b  t PagerLruList {
1950: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1960: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ;         /* Fir
1970: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
1980: 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1990: 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
19a0: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
19b0: 4c 52 55 20 6c 69 73 74 20 28 74 68 65 20 6d 6f  LRU list (the mo
19c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
19d0: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  ) */.  PgHdr *pF
19e0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a  irstSynced;   /*
19f0: 20 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c   First page in l
1a00: 69 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ist with PgHdr.n
1a10: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b  eedSync==0 */.};
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1a40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 78  contains the nex
1a50: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 70  t and previous p
1a60: 6f 69 6e 74 65 72 73 20 75 73 65 64 0a 2a 2a 20  ointers used.** 
1a70: 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48 64 72 20  to link a PgHdr 
1a80: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 61  structure into a
1a90: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 69   PagerLruList li
1aa0: 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a 2f 0a 74  nked list. .*/.t
1ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1ac0: 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61 67 65 72  gerLruLink Pager
1ad0: 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20  LruLink;.struct 
1ae0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 7b 0a 20  PagerLruLink {. 
1af0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
1b00: 20 50 67 48 64 72 20 2a 70 50 72 65 76 3b 0a 7d   PgHdr *pPrev;.}
1b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  ;../*.** Each in
1b20: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1b30: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1b40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1b50: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1b60: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1b70: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1b80: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1b90: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1ba0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1bb0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1bc0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1bd0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1be0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1bf0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1c00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c10: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1c20: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1c30: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1c40: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1c50: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1c60: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c70: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1c80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1c90: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1ca0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cb0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1cc0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1cd0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1ce0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1cf0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1d00: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1d10: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1d20: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1d30: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1d40: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1d50: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1d60: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1d70: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1d80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1d90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1da0: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1db0: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1dc0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1dd0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1de0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1df0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1e00: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1e10: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1e20: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1e30: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e40: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1e50: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1e60: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1e70: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1e80: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1e90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1ea0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ile..**.** Detai
1eb0: 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20  ls of important 
1ec0: 73 74 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e  structure elemen
1ed0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ts:.**.** needSy
1ee0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  nc.**.**     If 
1ef0: 74 68 69 73 20 69 73 20 74 72 75 65 2c 20 74 68  this is true, th
1f00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74  is means that it
1f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
1f20: 77 72 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a  write the page.*
1f30: 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f  *     content to
1f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1f50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
1f60: 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65  al content neede
1f70: 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c  d.**     for rol
1f80: 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79  lback has not by
1f90: 20 73 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d   synced to the m
1fa0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
1fb0: 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65  rnal..**     The
1fc0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1fd0: 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  t may have been 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72  written to the r
1ff0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
2000: 2a 2a 20 20 20 20 20 62 75 74 20 69 74 20 68 61  **     but it ha
2010: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73  s not yet been s
2020: 79 6e 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61  ynced.  So we ca
2030: 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68  nnot write to th
2040: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2050: 20 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 70    file because p
2060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67  ower failure mig
2070: 68 74 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ht cause the pag
2080: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
2090: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20   file.**     to 
20a0: 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 65 20  never reach the 
20b0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20  disk.  It is as 
20c0: 69 66 20 74 68 65 20 77 72 69 74 65 20 74 6f 20  if the write to 
20d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e0: 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74  .**     does not
20f0: 20 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65   occur until the
2100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2110: 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20   synced..**     
2120: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2130: 67 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  g is false if th
2140: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65  e page content e
2150: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77  xactly matches w
2160: 68 61 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65  hat.**     curre
2170: 6e 74 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74  ntly exists in t
2180: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2190: 2e 20 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20  .  The needSync 
21a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  flag is also.** 
21b0: 20 20 20 20 66 61 6c 73 65 20 69 66 20 74 68 65      false if the
21c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21d0: 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  t has been writt
21e0: 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  en to the main r
21f0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a  ollback.**     j
2200: 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65  ournal and synce
2210: 64 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  d.  If the page 
2220: 72 65 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77  represents a new
2230: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a   page that has.*
2240: 2a 20 20 20 20 20 62 65 65 6e 20 61 64 64 65 64  *     been added
2250: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
2270: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
2280: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
2290: 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e  ion, the needSyn
22a0: 63 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 75  c flag is true u
22b0: 6e 74 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61  ntil the origina
22c0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  l database.**   
22d0: 20 20 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f    size in the jo
22e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
22f0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2300: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f  disk..**.** inJo
2310: 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urnal.**.**     
2320: 54 68 69 73 20 69 73 20 74 72 75 65 20 69 66 20  This is true if 
2330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2340: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2350: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
2360: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
2370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
2380: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
2390: 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 61 64  for new pages ad
23a0: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
23b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23c0: 61 62 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e  abase file durin
23d0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20  ansaction..**   
23f0: 20 20 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20    And this flag 
2400: 73 61 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f  says nothing abo
2410: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
2420: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  t the journal.**
2430: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 73 79       has been sy
2440: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46  nced to disk.  F
2450: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 61 72  or pages that ar
2460: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
2470: 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73  l.**     databas
2480: 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  e file, the foll
2490: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
24a0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
24b0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24c0: 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20      inJournal = 
24d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24e0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24f0: 72 6e 61 6c 2c 20 70 67 6e 6f 29 0a 2a 2a 0a 2a  rnal, pgno).**.*
2500: 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65 72  *     The pPager
2510: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 6f 62 6a  ->pInJournal obj
2520: 65 63 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ect is only vali
2530: 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  d for the origin
2540: 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  al.**     pages 
2550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
2560: 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74   not new pages t
2570: 68 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f  hat are added to
2580: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
2590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
25a0: 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68   so obviously th
25b0: 65 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69  e above expressi
25c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  on cannot be.** 
25d0: 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65      valid for ne
25e0: 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65  w pages.  For ne
25f0: 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61  w pages inJourna
2600: 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a  l is always 0..*
2610: 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a  *.** dirty.**.**
2620: 20 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20       When true, 
2630: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2650: 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2660: 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64  .**     modified
2670: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2680: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61  le..**     If fa
26b0: 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  lse, it means th
26c0: 61 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  at either the co
26d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
26e0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68  e is.**     unch
26f0: 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68  anged or else th
2700: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69  e content is uni
2710: 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20  mportant and we 
2720: 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61  do not.**     ca
2730: 72 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  re whether or no
2740: 74 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65  t it is preserve
2750: 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52  d..**.** alwaysR
2760: 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  ollback.**.**   
2770: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2780: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2790: 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
27a0: 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a   API should be.*
27b0: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f  *     ignored fo
27c0: 72 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68  r this page.  Th
27d0: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
27e0: 20 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f   API attempts to
27f0: 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74   say.**     that
2800: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2810: 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b  the page on disk
2820: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2830: 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20  (it is an.**    
2840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20   unused page on 
2850: 74 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f  the freelist) so
2860: 20 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65   that it is unne
2870: 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20  cessary to .**  
2880: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e     rollback chan
2890: 67 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65  ges to this page
28a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
28b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
28c0: 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e  .**     can chan
28d0: 67 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ge without chang
28e0: 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  ing the meaning 
28f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2900: 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c    This.**     fl
2910: 61 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ag overrides any
2920: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2930: 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66  attempt.  This f
2940: 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  lag is set.**   
2950: 20 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68    when a page th
2960: 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  at originally co
2970: 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61  ntained valid da
2980: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  ta is added to.*
2990: 2a 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69  *     the freeli
29a0: 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68  st.  Later in th
29b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
29c0: 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69  on, this page mi
29d0: 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75  ght.**     be pu
29e0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  lled from the fr
29f0: 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  eelist and reuse
2a00: 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  d for something 
2a10: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20  different.**    
2a20: 20 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69   and at that poi
2a30: 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  nt the DontRollb
2a40: 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62  ack() API will b
2a50: 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65  e called because
2a60: 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61  .**     pages ta
2a70: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ken from the fre
2a80: 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65  elist do not nee
2a90: 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65  d to be protecte
2aa0: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
2ab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ac0: 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67  .  But this flag
2ad0: 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70   says that the p
2ae0: 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e  age was.**     n
2af0: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  ot originally pa
2b00: 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  rt of the freeli
2b10: 73 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74  st so that it st
2b20: 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20  ill needs to.** 
2b30: 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61      be rolled ba
2b40: 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61  ck in spite of a
2b50: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f  ny subsequent Do
2b60: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
2b70: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65  ls..**.** needRe
2b80: 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ad .**.**     Th
2b90: 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77  is flag means (w
2ba0: 68 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74  hen true) that t
2bb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2bc0: 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20  e page has.**   
2bd0: 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c    not yet been l
2be0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e  oaded from disk.
2bf0: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
2c00: 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a  content is just.
2c10: 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20  **     garbage. 
2c20: 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a   (Actually, we z
2c30: 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c  ero the content,
2c40: 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20   but you should 
2c50: 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20  not.**     make 
2c60: 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  any assumptions 
2c70: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2c80: 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29  t nevertheless.)
2c90: 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20    If the.**     
2ca0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
2cb0: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
2cc0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
2cd0: 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20  ad from the.**  
2ce0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61     original data
2cf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
2d00: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
2d10: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d30: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
2d40: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
2d50: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
2d60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2d90: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2da0: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
2db0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
2dc0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
2dd0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
2de0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72  .pgno */.  Pager
2df0: 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20  LruLink free;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e10: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66  t and previous f
2e20: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
2e30: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e50: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
2e60: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a  ages */.  u8 inJ
2e70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2e90: 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69   if has been wri
2ea0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
2eb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
2ee0: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
2ef0: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
2f00: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
2f30: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
2f40: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2f50: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f70: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2f80: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
2f90: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65   page */.  u8 ne
2fa0: 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20  edRead;         
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2fc0: 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67  d content if Pag
2fd0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
2fe0: 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  led */.  short i
2ff0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3010: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
3020: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
3030: 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72  dr *pDirty, *pPr
3040: 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44  evDirty;    /* D
3050: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69  irty pages */.#i
3060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3070: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
3080: 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c  MENT.  PagerLruL
3090: 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20  ink gfree;      
30a0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
30b0: 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20  list of nRef==0 
30c0: 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
30e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
30f0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
3100: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20  .  void *pData; 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a    /* Page data *
3130: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
3140: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
3150: 61 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  al data appended
3160: 20 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20   to this header 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
3180: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
3190: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
31a0: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
31b0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
31c0: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
31d0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
31e0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
31f0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
3200: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
3210: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
3220: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
3230: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
3250: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
3260: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
3270: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
3280: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
3290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
32a0: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
32b0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
32c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
32d0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
32e0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
32f0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
3300: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
3310: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
3320: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
3330: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
3340: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
3350: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
3360: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
3370: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
3380: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
3390: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
33a0: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
33b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
33c0: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
33d0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
33e0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
33f0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
3400: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
3410: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
3420: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
3430: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
3440: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
3450: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
3460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
3470: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3480: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
3490: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
34a0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
34b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
34c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
34d0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
3500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3510: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a  ubjournal */.};.
3520: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
3530: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
3540: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
3550: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
3560: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
3570: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
3580: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
3590: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
35a0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
35b0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
35c0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
35d0: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
35e0: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
35f0: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
3600: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
3610: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
3620: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
3630: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
3640: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3650: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
3660: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
3670: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
3680: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
3690: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
36a0: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
36b0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
36c0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
36d0: 5f 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29  _DATA(P)    ((P)
36e0: 2d 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65  ->pData).#define
36f0: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
3700: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
3710: 47 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  G)[1])).#define 
3720: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c  PGHDR_TO_HIST(P,
3730: 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20  PGR)  \.        
3740: 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a      ((PgHistory*
3750: 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b  )&((char*)(&(P)[
3760: 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74  1]))[(PGR)->nExt
3770: 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  ra])../*.** A op
3780: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
3790: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
37a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
37b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50  ructure..**.** P
37c0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
37d0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
37e0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
37f0: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f  CORRUPT, or.** o
3800: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
3810: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
3820: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
3830: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
3840: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
3850: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
3860: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
3870: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
3880: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
3890: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
38a0: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
38b0: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
38c0: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
38d0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
38e0: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
38f0: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
3900: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
3910: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
3920: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
3930: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
3940: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
3950: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
3960: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  Lookup().** APIs
3970: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
3980: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
3990: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
39a0: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
39b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
39c0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
39d0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
39e0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  r IO */.  u8 jou
39f0: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3a20: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3a30: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3a40: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3a50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3a60: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3a70: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3a80: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3aa0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ab0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3ac0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3ad0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3ae0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3af0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3b00: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3b10: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b30: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3b40: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3b50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3b60: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3b80: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
3b90: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
3ba0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
3bb0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
3bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
3bd0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
3be0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3bf0: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3c00: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3c10: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3c20: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3c30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3c40: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c60: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3c80: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
3c90: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3cb0: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
3cc0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
3cd0: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cf0: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
3d00: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
3d10: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
3d20: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
3d40: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
3d50: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
3d60: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3d80: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
3d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
3da0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
3dd0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3df0: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
3e20: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
3e30: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
3e40: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
3e50: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
3e60: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
3e70: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
3e80: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3eb0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ec0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
3ef0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
3f00: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
3f10: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f30: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3f40: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3f50: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3f60: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3f70: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3f80: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3f90: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3fa0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3fb0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3fd0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
3fe0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
3ff0: 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64  es */.  u8 dbMod
4000: 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20  ified;          
4010: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4020: 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61  here are any cha
4030: 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a  nges to the Db *
4040: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
4050: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
4060: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
4070: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
4080: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
4090: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40b0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
40c0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
40d0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
4100: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
4110: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
4120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
4160: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4170: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
4180: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
4190: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
41a0: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
41c0: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
41d0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
41e0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
41f0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
4200: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4210: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4220: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4230: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
4240: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4250: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4260: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4270: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4280: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
4290: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
42a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
42b0: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
42c0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
42d0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
42e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
42f0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
4300: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
4310: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
4320: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4340: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4350: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
4360: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
4370: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
4380: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
4390: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
43a0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
43c0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
43d0: 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67  ry pages with Pg
43e0: 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20  Hdr.nRef>0 */.  
43f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4410: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
4420: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
4430: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
4440: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
4450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4460: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
4470: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4480: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
4490: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
44a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
44b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
44c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
44d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e  */.  Bitvec *pIn
44e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
44f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4500: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4510: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
4520: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4550: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4560: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
45a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
45b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
45c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
45d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
45e0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  es */.  char *zS
45f0: 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20 20 20  tmtJrnl;        
4600: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4610: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
4620: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73  rnal file */.  s
4630: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4640: 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69   *jfd;     /* Fi
4650: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
4660: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
4670: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
4680: 69 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b  ite3_file *stfd;
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
46a0: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
46b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
46c0: 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73  bjournal*/.  Bus
46d0: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
46e0: 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e  andler;  /* Poin
46f0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75  ter to sqlite.bu
4700: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50  syHandler */.  P
4710: 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b  agerLruList lru;
4720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 52             /* LR
4730: 55 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  U list of free p
4740: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
4750: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
4760: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4770: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
4780: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
4790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
47a0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
47b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
47c0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67  bjournal */.  Pg
47d0: 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20  Hdr *pDirty;    
47e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
47f0: 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70  t of all dirty p
4800: 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ages */.  i64 jo
4810: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
4820: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4830: 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20   byte offset in 
4840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4850: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
4860: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
4870: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
4880: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
4890: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
48a0: 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b   i64 stmtHdrOff;
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
48c0: 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  First journal he
48d0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69  ader written thi
48e0: 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
48f0: 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20   i64 stmtCksum; 
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4910: 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73  cksumInit when s
4920: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
4930: 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74  rted */.  i64 st
4940: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
4950: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4960: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
4970: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
4980: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
4990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
49a0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
49b0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
49c0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
49d0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
49e0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
49f0: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
4a00: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
4a10: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
4a20: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
4a30: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
4a40: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
4a50: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
4a60: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 44  (*xDestructor)(D
4a70: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20  bPage*,int); /* 
4a80: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
4a90: 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70  e when freeing p
4aa0: 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  ages */.  void (
4ab0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
4ac0: 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  ge*,int);   /* C
4ad0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
4ae0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
4af0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
4b00: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
4b10: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
4b20: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
4b30: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
4b40: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
4b50: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
4b60: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
4b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4b80: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4b90: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64  xCodec() */.#end
4ba0: 69 66 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20  if.  int nHash; 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
4bd0: 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65  pager hash table
4be0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48   */.  PgHdr **aH
4bf0: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
4c00: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
4c10: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
4c20: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23  er to PgHdr */.#
4c30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4c40: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
4c50: 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70  EMENT.  Pager *p
4c60: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
4c70: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69      /* Doubly li
4c80: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
4c90: 65 72 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a  ers on which */.
4ca0: 20 20 50 61 67 65 72 20 2a 70 50 72 65 76 3b 20    Pager *pPrev; 
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4cc0: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
4cd0: 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77  _memory() will w
4ce0: 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e  ork */.  int iIn
4cf0: 55 73 65 4d 4d 3b 20 20 20 20 20 20 20 20 20 20  UseMM;          
4d00: 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f       /* Non-zero
4d10: 20 69 66 20 75 6e 61 76 61 69 6c 61 62 6c 65 20   if unavailable 
4d20: 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  to MM */.  int i
4d30: 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20 20 20  InUseDB;        
4d40: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
4d50: 72 6f 20 69 66 20 69 6e 20 73 71 6c 69 74 65 33  ro if in sqlite3
4d60: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
4d70: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  ) */.#endif.  ch
4d80: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
4d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
4da0: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
4db0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
4dc0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
4dd0: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4df0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4e00: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4e10: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
4e20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4e30: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4e40: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4e50: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4e60: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4e70: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4e80: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4e90: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4ea0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4eb0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4ec0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4ed0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4ee0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4ef0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4f00: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4f10: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4f20: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4f30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4f40: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4f50: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4f60: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4f70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4f80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4f90: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4fa0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4fb0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4fc0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4fd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4fe0: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
4ff0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
5000: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
5010: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
5020: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
5030: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
5040: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
5050: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(v).#endif../*.
5060: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
5070: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
5080: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
5090: 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20  a double-linked 
50a0: 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70  list.** of all p
50b0: 61 67 65 72 73 20 74 68 61 74 20 61 72 65 20 65  agers that are e
50c0: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67 65  ligible for page
50d0: 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68 65   stealing by the
50e0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  .** sqlite3_rele
50f0: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74  ase_memory() int
5100: 65 72 66 61 63 65 2e 20 20 41 63 63 65 73 73 20  erface.  Access 
5110: 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 0a  to this list is.
5120: 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  ** protected by 
5130: 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  the SQLITE_MUTEX
5140: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74  _STATIC_MEM2 mut
5150: 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ex..*/.#ifdef SQ
5160: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
5170: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74  RY_MANAGEMENT.st
5180: 61 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c 69  atic Pager *sqli
5190: 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 30  te3PagerList = 0
51a0: 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c 72  ;.static PagerLr
51b0: 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72 75  uList sqlite3Lru
51c0: 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30  PageList = {0, 0
51d0: 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f  , 0};.#endif.../
51e0: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
51f0: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
5200: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
5210: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
5220: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
5230: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
5240: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
5250: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
5260: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
5270: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
5280: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
5290: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
52a0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
52b0: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
52c0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
52d0: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
52e0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
52f0: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
5300: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
5310: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
5320: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
5340: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
5350: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
5360: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
5370: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
5380: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
5390: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
53a0: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
53b0: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
53c0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
53d0: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
53e0: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
53f0: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
5400: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
5410: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
5420: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
5430: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
5440: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
5450: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
5460: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
5470: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
5480: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
5490: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
54a0: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
54b0: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
54c0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
54d0: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
54e0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
54f0: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
5500: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
5510: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5520: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
5530: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
5540: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
5550: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
5560: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
5570: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
5580: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
5590: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
55a0: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
55b0: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
55c0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
55d0: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
55e0: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
55f0: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
5600: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
5610: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
5620: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
5630: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
5640: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
5650: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
5660: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
5670: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
5680: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
5690: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
56a0: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
56b0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
56c0: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
56d0: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
56e0: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
56f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5700: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5710: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
5720: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
5730: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
5740: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
5750: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
5760: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
5770: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
5780: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
5790: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
57a0: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
57b0: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
57c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
57d0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
57e0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
57f0: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5800: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
5810: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
5820: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
5830: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
5840: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
5850: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
5860: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
5870: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
5880: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
5890: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
58a0: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
58b0: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
58c0: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
58d0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
58e0: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
58f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5900: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5910: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5920: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
5930: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
5940: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
5950: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
5960: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
5970: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
5980: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5990: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
59a0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
59b0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
59c0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
59d0: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
59e0: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
59f0: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5a00: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5a20: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
5a30: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
5a40: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
5a50: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5a60: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
5a70: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
5a80: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
5a90: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
5aa0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
5ab0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
5ac0: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
5ad0: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
5ae0: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
5af0: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
5b00: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
5b10: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
5b20: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
5b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
5b40: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
5b50: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
5b60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
5b70: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
5b80: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
5b90: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
5ba0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
5bb0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
5bc0: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
5bd0: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
5be0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
5bf0: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
5c00: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
5c10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
5c20: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
5c30: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5c40: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
5c50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5c60: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
5c70: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5c80: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5c90: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5ca0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
5cb0: 54 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29  The pagerEnter()
5cc0: 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28   and pagerLeave(
5cd0: 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69  ) routines acqui
5ce0: 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a  re and release.*
5cf0: 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63  * a mutex on eac
5d00: 68 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75  h pager.  The mu
5d10: 74 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65  tex is recursive
5d20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
5d30: 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73  a special-purpos
5d40: 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c  e mutex.  It onl
5d50: 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61  y provides mutua
5d60: 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62  l exclusion.** b
5d70: 65 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65  etween the Btree
5d80: 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20   and the Memory 
5d90: 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74  Management sqlit
5da0: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
5db0: 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  y().** function.
5dc0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72    It does not pr
5dd0: 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70  event, for examp
5de0: 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66  le, two Btrees f
5df0: 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a  rom accessing.**
5e00: 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
5e10: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
5e20: 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c  .  Other general
5e30: 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73  -purpose mutexes
5e40: 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   in.** the btree
5e50: 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68   layer handle th
5e60: 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66  at chore..*/.#if
5e70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5e80: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
5e90: 45 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69  ENT.  static voi
5ea0: 64 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67  d pagerEnter(Pag
5eb0: 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69  er *p){.    p->i
5ec0: 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69  InUseDB++;.    i
5ed0: 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26  f( p->iInUseMM &
5ee0: 26 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31  & p->iInUseDB==1
5ef0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
5f00: 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20  TE_MUTEX_NOOP.  
5f10: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5f20: 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  x *mutex;.      
5f30: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
5f40: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
5f50: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5f60: 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20  MEM2);.#endif.  
5f70: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20      p->iInUseDB 
5f80: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
5f90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
5fa0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  utex);.      p->
5fb0: 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20  iInUseDB = 1;.  
5fc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
5fd0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a  x_leave(mutex);.
5fe0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
5ff0: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30  ( p->iInUseMM==0
6000: 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   );.  }.  static
6010: 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65   void pagerLeave
6020: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20  (Pager *p){.    
6030: 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20  p->iInUseDB--;. 
6040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49     assert( p->iI
6050: 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d  nUseDB>=0 );.  }
6060: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
6070: 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20  pagerEnter(X).# 
6080: 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76  define pagerLeav
6090: 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(X).#endif../*.
60a0: 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20  ** Add page pPg 
60b0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
60c0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61  e linked list ma
60d0: 6e 61 67 65 64 20 62 79 20 73 74 72 75 63 74 75  naged by structu
60e0: 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67  re.** pList (pPg
60f0: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73   becomes the las
6100: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c  t entry in the l
6110: 69 73 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72  ist - the most r
6120: 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64  ecently .** used
6130: 29 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ). Argument pLin
6140: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
6150: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6160: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6170: 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  ,.** depending o
6180: 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73  n whether pPg is
6190: 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20   being added to 
61a0: 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66  the pager-specif
61b0: 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20  ic or.** global 
61c0: 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  LRU list..*/.sta
61d0: 74 69 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64  tic void listAdd
61e0: 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70  (PagerLruList *p
61f0: 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69  List, PagerLruLi
6200: 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72  nk *pLink, PgHdr
6210: 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d   *pPg){.  pLink-
6220: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c  >pNext = 0;.  pL
6230: 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69  ink->pPrev = pLi
6240: 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64  st->pLast;..#ifd
6250: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6260: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6270: 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  NT.  assert(pLin
6280: 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c  k==&pPg->free ||
6290: 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66   pLink==&pPg->gf
62a0: 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ree);.  assert(p
62b0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
62c0: 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c  e || pList!=&sql
62d0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29  ite3LruPageList)
62e0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
62f0: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a  pList->pLast ){.
6300: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28      int iOff = (
6310: 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28  char *)pLink - (
6320: 63 68 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20  char *)pPg;.    
6330: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6340: 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72  astLink = (Pager
6350: 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38  LruLink *)(&((u8
6360: 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29   *)pList->pLast)
6370: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61  [iOff]);.    pLa
6380: 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20  stLink->pNext = 
6390: 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pPg;.  }else{.  
63a0: 20 20 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d    assert(!pList-
63b0: 3e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c  >pFirst);.    pL
63c0: 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ist->pFirst = pP
63d0: 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d  g;.  }..  pList-
63e0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
63f0: 69 66 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72  if( !pList->pFir
6400: 73 74 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d  stSynced && pPg-
6410: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a  >needSync==0 ){.
6420: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
6430: 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
6440: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
6450: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6460: 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20  list managed by 
6470: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
6480: 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73  inted to by pLis
6490: 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  t..**.** Argumen
64a0: 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70  t pLink should p
64b0: 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70  oint to either p
64c0: 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d  Pg->free or pPg-
64d0: 3e 67 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e  >gfree, dependin
64e0: 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72  g .** on whether
64f0: 20 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64   pPg is being ad
6500: 64 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72  ded to the pager
6510: 2d 73 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f  -specific or glo
6520: 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f  bal LRU list..*/
6530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73  .static void lis
6540: 74 52 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75  tRemove(PagerLru
6550: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67  List *pList, Pag
6560: 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b  erLruLink *pLink
6570: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
6580: 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61   int iOff = (cha
6590: 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61  r *)pLink - (cha
65a0: 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66  r *)pPg;..#ifdef
65b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
65c0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
65d0: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
65e0: 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70  =&pPg->free || p
65f0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6600: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  e);.  assert(pLi
6610: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20  nk==&pPg->gfree 
6620: 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74  || pList!=&sqlit
6630: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a  e3LruPageList);.
6640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
6650: 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  g==pList->pFirst
6660: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70   ){.    pList->p
6670: 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70  First = pLink->p
6680: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
6690: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73  pPg==pList->pLas
66a0: 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  t ){.    pList->
66b0: 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pLast = pLink->p
66c0: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
66d0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a  pLink->pPrev ){.
66e0: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
66f0: 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50   *pPrevLink = (P
6700: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
6710: 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50  ((u8 *)pLink->pP
6720: 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  rev)[iOff]);.   
6730: 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78   pPrevLink->pNex
6740: 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  t = pLink->pNext
6750: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e  ;.  }.  if( pLin
6760: 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  k->pNext ){.    
6770: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e  PagerLruLink *pN
6780: 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72  extLink = (Pager
6790: 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38  LruLink *)(&((u8
67a0: 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29   *)pLink->pNext)
67b0: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65  [iOff]);.    pNe
67c0: 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20  xtLink->pPrev = 
67d0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20  pLink->pPrev;.  
67e0: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  }.  if( pPg==pLi
67f0: 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  st->pFirstSynced
6800: 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
6810: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6820: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
6830: 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a   p->needSync ){.
6840: 20 20 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69        PagerLruLi
6850: 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c  nk *pL = (PagerL
6860: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
6870: 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  *)p)[iOff]);.   
6880: 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74     p = pL->pNext
6890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
68a0: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
68b0: 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e  = p;.  }..  pLin
68c0: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b  k->pNext = pLink
68d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a  ->pPrev = 0;.}..
68e0: 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20  /* .** Add page 
68f0: 70 50 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20  pPg to the list 
6900: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 66 6f  of free pages fo
6910: 72 20 74 68 65 20 70 61 67 65 72 2e 20 49 66 20  r the pager. If 
6920: 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67  .** memory-manag
6930: 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
6940: 2c 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70  , also add the p
6950: 61 67 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  age to the globa
6960: 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72  l .** list of fr
6970: 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ee pages..*/.sta
6980: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6990: 41 64 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b  Add(PgHdr *pPg){
69a0: 0a 20 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d  .  listAdd(&pPg-
69b0: 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70  >pPager->lru, &p
69c0: 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a  Pg->free, pPg);.
69d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
69e0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
69f0: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6a00: 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
6a10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6a20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
6a30: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6a40: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6a50: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c  TIC_LRU));.    l
6a60: 69 73 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c  istAdd(&sqlite3L
6a70: 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67  ruPageList, &pPg
6a80: 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20  ->gfree, pPg);. 
6a90: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6aa0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
6ab0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6ac0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6ad0: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
6ae0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76  .}../* .** Remov
6af0: 65 20 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20  e page pPg from 
6b00: 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  the list of free
6b10: 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 61   pages for the a
6b20: 73 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e  ssociated pager.
6b30: 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61  .** If memory-ma
6b40: 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
6b50: 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65  led, also remove
6b60: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c   pPg from the gl
6b70: 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  obal list.** of 
6b80: 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  free pages..*/.s
6b90: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6ba0: 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a  stRemove(PgHdr *
6bb0: 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f  pPg){.  listRemo
6bc0: 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d  ve(&pPg->pPager-
6bd0: 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65  >lru, &pPg->free
6be0: 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  , pPg);.#ifdef S
6bf0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6c00: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6c10: 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65   if( !pPg->pPage
6c20: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6c30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6c40: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
6c50: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6c60: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6c70: 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76  );.    listRemov
6c80: 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  e(&sqlite3LruPag
6c90: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6ca0: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6cc0: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6cd0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6ce0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6cf0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6d00: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
6d10: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  ion is called ju
6d20: 73 74 20 61 66 74 65 72 20 74 68 65 20 6e 65 65  st after the nee
6d30: 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62  dSync flag has b
6d40: 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66  een cleared.** f
6d50: 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61  rom all pages ma
6d60: 6e 61 67 65 64 20 62 79 20 70 50 61 67 65 72 20  naged by pPager 
6d70: 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65  (usually because
6d80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6d90: 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65  e.** has just be
6da0: 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75  en synced). It u
6db0: 70 64 61 74 65 73 20 74 68 65 20 70 50 61 67 65  pdates the pPage
6dc0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
6dd0: 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ced variable.** 
6de0: 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  and, if memory-m
6df0: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
6e00: 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65  bled, the sqlite
6e10: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6e20: 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72  rstSynced.** var
6e30: 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73  iable also..*/.s
6e40: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6e50: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
6e60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6e70: 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  .  pPager->lru.p
6e80: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
6e90: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6ea0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6eb0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6ec0: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6ed0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6ee0: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
6ef0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6f00: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
6f10: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6f20: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6f30: 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  RU));.    for(p=
6f40: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6f50: 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20  st.pFirst; p && 
6f60: 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70  p->needSync; p=p
6f70: 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a  ->gfree.pNext);.
6f80: 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50      assert(p==pP
6f90: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6fa0: 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c  Synced || p==sql
6fb0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
6fc0: 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20  pFirstSynced);. 
6fd0: 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67     sqlite3LruPag
6fe0: 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63  eList.pFirstSync
6ff0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69  ed = p;.    sqli
7000: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7010: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
7020: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
7030: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
7040: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
7050: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
7060: 66 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20  f page *pPg has 
7070: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
7080: 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tten to the stat
7090: 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ement.** journal
70a0: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73   (or statement s
70b0: 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e  napshot has been
70c0: 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50   created, if *pP
70d0: 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  g is part.** of 
70e0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
70f0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
7100: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74  c int pageInStat
7110: 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ement(PgHdr *pPg
7120: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7130: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7140: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
7150: 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44  .    return PGHD
7160: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
7170: 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a  Pager)->inStmt;.
7180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7190: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
71a0: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
71b0: 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
71c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
71d0: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
71e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
71f0: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
7200: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
7210: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
7220: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7230: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
7240: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
7250: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
7260: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
7270: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
7280: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
7290: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
72a0: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
72b0: 54 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65 6f 66  T.  if( N*sizeof
72c0: 28 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c 49 54  (aHash[0])>SQLIT
72d0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
72e0: 4d 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d 20 53  MIT ){.    N = S
72f0: 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46  QLITE_MALLOC_SOF
7300: 54 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66 28 61  T_LIMIT/sizeof(a
7310: 48 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  Hash[0]);.  }.  
7320: 69 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e  if( N==pPager->n
7330: 48 61 73 68 20 29 20 72 65 74 75 72 6e 3b 0a 23  Hash ) return;.#
7340: 65 6e 64 69 66 0a 20 20 70 61 67 65 72 4c 65 61  endif.  pagerLea
7350: 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
7360: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21  ( pPager->aHash!
7370: 3d 30 20 29 20 73 71 6c 69 74 65 33 46 61 75 6c  =0 ) sqlite3Faul
7380: 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 53 51 4c  tBeginBenign(SQL
7390: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
73a0: 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 61 48 61  R_MALLOC);.  aHa
73b0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
73c0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
73d0: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
73e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
73f0: 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33 46 61  h!=0 ) sqlite3Fa
7400: 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28 53 51 4c  ultEndBenign(SQL
7410: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
7420: 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 70 61 67  R_MALLOC);.  pag
7430: 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
7440: 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20  .  if( aHash==0 
7450: 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72  ){.    /* Failur
7460: 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e  e to rehash is n
7470: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74  ot an error.  It
7480: 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f   is only a perfo
7490: 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20  rmance hit. */. 
74a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
74b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
74c0: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
74d0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
74e0: 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  N;.  pPager->aHa
74f0: 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f  sh = aHash;.  fo
7500: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7510: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7520: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7530: 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20   int h;.    if( 
7540: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
7550: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
7560: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
7570: 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
7580: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  h==0 );.      co
7590: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
75a0: 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20    h = pPg->pgno 
75b0: 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67  & (N-1);.    pPg
75c0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48  ->pNextHash = aH
75d0: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20  ash[h];.    if( 
75e0: 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
75f0: 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65    aHash[h]->pPre
7600: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
7610: 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20   }.    aHash[h] 
7620: 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e  = pPg;.    pPg->
7630: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
7640: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
7650: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
7660: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
7670: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7680: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
7690: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
76a0: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
76b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
76c0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
76d0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
76e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
76f0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7700: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
7710: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
7720: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
7730: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
7740: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
7750: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7760: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
7770: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
7780: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
7790: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
77a0: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
77b0: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
77c0: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
77d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
77e0: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
77f0: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
7800: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7810: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
7820: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
7830: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
7840: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
7850: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
7860: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
7870: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
7880: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
7890: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
78a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
78b0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
78c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
78d0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
78e0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
78f0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
7900: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7910: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
7920: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
7930: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
7940: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
7950: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
7960: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
7970: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
7980: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
7990: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
79a0: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
79b0: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
79c0: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
79d0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
79e0: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
79f0: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
7a00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
7a10: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
7a20: 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74    if( !pFd->pMet
7a30: 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75  hods ){.    retu
7a40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7a50: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
7a60: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20  e3OsUnlock(pFd, 
7a70: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
7a80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
7a90: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
7aa0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
7ab0: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
7ac0: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
7ad0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
7ae0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
7af0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
7b00: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
7b10: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
7b20: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
7b30: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7b40: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
7b50: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
7b60: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
7b70: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
7b80: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
7b90: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7ba0: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
7bb0: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
7bc0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
7bd0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
7be0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  size..**.** If t
7bf0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7c00: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
7c10: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
7c20: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
7c30: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
7c40: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
7c50: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7c60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
7c70: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
7c80: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
7c90: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
7ca0: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
7cb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
7cc0: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
7cd0: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
7ce0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
7cf0: 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20  r){.  int dc;   
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
7d10: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
7d20: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74  s */.  int nSect
7d30: 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74  or;      /* Sect
7d40: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  or size */.  int
7d50: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f   nPage;        /
7d60: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  * Page size */. 
7d70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7d80: 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
7d90: 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  .  if( fd->pMeth
7da0: 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20  ods ){.    dc = 
7db0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
7dc0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66  haracteristics(f
7dd0: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
7de0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
7df0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e  rSize(fd);.    n
7e00: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
7e10: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  ageSize;.  }..  
7e20: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
7e30: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
7e40: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65  512>>8));.  asse
7e50: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7e60: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
7e70: 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21  6>>8));..  if( !
7e80: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20  fd->pMethods || 
7e90: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
7ea0: 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e  P_ATOMIC|(nPage>
7eb0: 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e  >8))&&nSector<=n
7ec0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Page) ){.    ret
7ed0: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
7ee0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
7ef0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
7f00: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
7f10: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
7f20: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7f30: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
7f40: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
7f50: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
7f60: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
7f70: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
7f80: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
7f90: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
7fa0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
7fb0: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
7fc0: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
7fd0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
7fe0: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
7ff0: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
8000: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
8010: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
8020: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
8030: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
8040: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
8050: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
8060: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
8070: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
8080: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
8090: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
80a0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
80b0: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
80c0: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
80d0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
80e0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
80f0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
8100: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
8110: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
8120: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
8130: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
8140: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
8150: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
8160: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
8170: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
8180: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
8190: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
81a0: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
81b0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
81c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
81d0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
81e0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
81f0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
8200: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
8210: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
8220: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
8230: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
8240: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
8250: 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61  replayed..*/.sta
8260: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
8270: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
8280: 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ger);.static int
8290: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
82a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
82b0: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
82c0: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
82d0: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
82e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
82f0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
8300: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
8310: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
8320: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
8330: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
8340: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
8350: 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72    );.  if(.    r
8360: 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
8370: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
8380: 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
8390: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  rc2==SQLITE_CORR
83a0: 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61  UPT.  ){.    pPa
83b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
83c0: 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  c;.    if( pPage
83d0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
83e0: 55 4e 4c 4f 43 4b 20 26 26 20 70 50 61 67 65 72  UNLOCK && pPager
83f0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
8400: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
8410: 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e  er is already un
8420: 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67  locked, call pag
8430: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20  er_unlock() now 
8440: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  to.      ** clea
8450: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
8460: 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61  e and ensure tha
8470: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
8480: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63  e is .      ** c
8490: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
84a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
84b0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
84c0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
84d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
84e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
84f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
8500: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
8510: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
8520: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
8530: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
8540: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
8550: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
8560: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
8570: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
8580: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8590: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
85a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
85b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
85c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
85d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
85e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
85f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
8600: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
8610: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
8620: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
8630: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
8640: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
8650: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
8660: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
8670: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
8680: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
8690: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
86a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
86b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
86c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
86d0: 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20 20  eSize, .        
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
8700: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
8710: 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
8720: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
8730: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
8740: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
8750: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
8760: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
8770: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
8780: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
8790: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
87a0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
87b0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
87c0: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
87d0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
87e0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
87f0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
8800: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
8810: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
8820: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
8830: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
8840: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
8850: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
8860: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
8870: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
8880: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
8890: 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  e || MEMDB || pP
88a0: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
88b0: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
88c0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
88d0: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
88e0: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
88f0: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
8900: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
8910: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
8920: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
8930: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
8940: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
8950: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
8960: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
8970: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
8980: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
8990: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
89a0: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
89b0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
89c0: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
89d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
89e0: 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  ry supplied by t
89f0: 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a  he caller. .**.*
8a00: 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70  * zMaster must p
8a10: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
8a20: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61   of at least nMa
8a30: 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63  ster bytes alloc
8a40: 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63  ated by.** the c
8a50: 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75  aller. This shou
8a60: 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66  ld be sqlite3_vf
8a70: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28  s.mxPathname+1 (
8a80: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20  to ensure there 
8a90: 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61  is.** enough spa
8aa0: 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ce to write the 
8ab0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8ac0: 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73  ame). If the mas
8ad0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e  ter journal.** n
8ae0: 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ame in the journ
8af0: 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61  al is longer tha
8b00: 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  n nMaster bytes 
8b10: 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20  (including a.** 
8b20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c  nul-terminator),
8b30: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61   then this is ha
8b40: 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d  ndled as if no m
8b50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8b60: 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  me.** were prese
8b70: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
8b80: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  l..**.** If no m
8b90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8ba0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
8bb0: 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  nt zMaster[0] is
8bc0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
8bd0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
8be0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8bf0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
8c00: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
8c10: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
8c20: 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61  zMaster, int nMa
8c30: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8c40: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
8c50: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
8c60: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
8c70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8c80: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
8c90: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
8ca0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
8cb0: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
8cc0: 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71  '\0';..  rc = sq
8cd0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
8ce0: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
8cf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8d00: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
8d10: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8d20: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8d30: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
8d40: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d50: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8d60: 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e  c;..  if( len>=n
8d70: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
8d80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d90: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
8da0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8db0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  J-12, &cksum);. 
8dc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8dd0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8de0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8df0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
8e00: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a  gic, 8, szJ-8);.
8e10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8e20: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
8e30: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8e40: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
8e50: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8e60: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8e70: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
8e80: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
8e90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8ea0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8eb0: 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  c;.  }.  zMaster
8ec0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [len] = '\0';.. 
8ed0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
8ee0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
8ef0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8f00: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
8f10: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
8f20: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
8f30: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d  zMaster[i];.   }
8f40: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
8f50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
8f60: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
8f70: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
8f80: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
8f90: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
8fa0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
8fb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8fc0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
8fd0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
8fe0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
8ff0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
9000: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
9010: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
9020: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
9030: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
9040: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
9050: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30  */.    zMaster[0
9060: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
9070: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
9080: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9090: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
90a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
90b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
90c0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
90d0: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
90e0: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
90f0: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
9100: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
9110: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
9120: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
9130: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
9140: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
9150: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
9160: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
9170: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
9180: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
9240: 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f  atic void seekJo
9250: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9260: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
9270: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
9280: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
9290: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
92a0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
92b0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
92c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
92d0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
92e0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
92f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
9300: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
9310: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
9320: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9330: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
9340: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
9350: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9360: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
9370: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
9380: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  set;.}../*.** Wr
9390: 69 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74  ite zeros over t
93a0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
93b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
93c0: 54 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20  This has the.** 
93d0: 65 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69  effect of invali
93e0: 64 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  dating the journ
93f0: 61 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d  al file and comm
9400: 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72  itting the.** tr
9410: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
9420: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
9430: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9440: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
9450: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
9460: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9470: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9480: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a  r zeroHdr[28];..
9490: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
94a0: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
94b0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
94c0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
94d0: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
94e0: 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  ncate ){.      r
94f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
9500: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
9510: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
9520: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9530: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9540: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
9550: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
9560: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
9570: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9580: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9590: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
95a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
95b0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
95c0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
95d0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
95e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
9600: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9610: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9620: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9630: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9640: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9650: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9660: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9670: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9680: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9690: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
96a0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
96b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
96c0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
96d0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
96e0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
96f0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
9700: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9710: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9720: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9730: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9740: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9750: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9760: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9770: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9780: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9790: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
97a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
97b0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
97c0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
97d0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
97e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
97f0: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
9800: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
9810: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
9820: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
9830: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
9840: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
9850: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
9860: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9870: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
9880: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9890: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
98a0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
98b0: 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  e;.  int nHeader
98c0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
98d0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ize;.  int nWrit
98e0: 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  e;..  if( nHeade
98f0: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
9900: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9910: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
9920: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9930: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
9940: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
9950: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
9960: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
9970: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9980: 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f  f;.  }..  seekJo
9990: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
99a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
99b0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
99c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
99d0: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
99e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
99f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9a00: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
9a10: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
9a20: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
9a30: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
9a40: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
9a50: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
9a60: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
9a70: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
9a80: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
9a90: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
9aa0: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
9ab0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
9ac0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
9ad0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
9ae0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
9af0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
9b00: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
9b10: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
9b20: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
9b30: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
9b40: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
9b50: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
9b60: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
9b70: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
9b80: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
9b90: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
9ba0: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
9bb0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9bc0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
9bd0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
9be0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
9bf0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
9c00: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9c10: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
9c20: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
9c30: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
9c40: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
9c50: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9c60: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
9c70: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
9c80: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
9c90: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
9ca0: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
9cb0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
9cc0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
9cd0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
9ce0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
9cf0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
9d00: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
9d10: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
9d20: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
9d30: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
9d40: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
9d50: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
9d60: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
9d70: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
9d80: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
9d90: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
9da0: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
9db0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
9dc0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
9dd0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
9de0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
9df0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
9e00: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
9e10: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
9e20: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
9e30: 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28  noSync) .   || (
9e40: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
9e50: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
9e60: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
9e70: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
9e80: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  END) .  ){.    p
9e90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9ea0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9eb0: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
9ec0: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
9ed0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
9ee0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9ef0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
9f00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
9f10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
9f20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
9f30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
9f40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9f50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9f60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9f70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9f80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9f90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9fa0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9fb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9fc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9fd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9fe0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9ff0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a000: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
a010: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
a020: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
a030: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
a040: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
a050: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a060: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a070: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
a080: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
a090: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
a0a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29  >journalHdr==0 )
a0b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
a0c0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75  e size */.    pu
a0d0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a0e0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a0f0: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
a100: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a110: 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65   }..  for(nWrite
a120: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
a130: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
a140: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a150: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
a160: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
a170: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
a180: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
a190: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
a1a0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
a1b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a1c0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a1d0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
a1e0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
a1f0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67  alOff);.    pPag
a200: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a210: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
a220: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a230: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
a240: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
a250: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
a260: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
a270: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
a280: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
a290: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
a2a0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
a2b0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
a2c0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
a2d0: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
a2e0: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
a2f0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
a300: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
a310: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
a320: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
a330: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
a340: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
a350: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
a360: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
a370: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
a380: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
a390: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
a3a0: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
a3b0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
a3c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
a3d0: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
a3e0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
a3f0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
a400: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
a410: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
a420: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
a430: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a440: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
a450: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
a460: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
a470: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
a480: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a490: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
a4a0: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
a4b0: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
a4c0: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
a4d0: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
a4e0: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
a4f0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a500: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
a510: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a520: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
a530: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a540: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a550: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
a560: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
a570: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
a580: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
a590: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
a5a0: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
a5b0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
a5c0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
a5d0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
a5e0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
a5f0: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f  r */.  i64 jrnlO
a600: 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53  ff;.  int iPageS
a610: 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  ize;..  seekJour
a620: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
a630: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a640: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
a650: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a660: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
a670: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a680: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a  TE_DONE;.  }.  j
a690: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
a6a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
a6b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a6c0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
a6d0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
a6e0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
a6f0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a700: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
a710: 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67  f += sizeof(aMag
a720: 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63  ic);..  if( memc
a730: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
a740: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
a750: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
a760: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a770: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
a780: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a790: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a7a0: 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  Off, pNRec);.  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 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a7d0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a7e0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70  d, jrnlOff+4, &p
a7f0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a800: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a810: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a820: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a830: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a840: 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  +8, pDbSize);.  
a850: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a860: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a870: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a880: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20  fd, jrnlOff+16, 
a890: 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a  (u32 *)&iPageSiz
a8a0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
a8b0: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69  LITE_OK .   && i
a8c0: 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20  PageSize>=512 . 
a8d0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d    && iPageSize<=
a8e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
a8f0: 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50  SIZE .   && ((iP
a900: 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
a910: 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  Size)==0 .  ){. 
a920: 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20     u16 pagesize 
a930: 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  = iPageSize;.   
a940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a950: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a960: 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29  ager, &pagesize)
a970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
a980: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
a990: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
a9a0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
a9b0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
a9c0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
a9d0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
a9e0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
a9f0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
aa00: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
aa10: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
aa20: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
aa30: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
aa40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
aa50: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
aa60: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
aa70: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
aa80: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
aa90: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
aaa0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
aab0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
aac0: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
aad0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
aae0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
aaf0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32  >jfd, jrnlOff+12
ab00: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
ab10: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
ab20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ab30: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
ab40: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
ab50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ab60: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
ab70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
ab80: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
ab90: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
aba0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
abb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
abc0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
abd0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
abe0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
abf0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ac00: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
ac10: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
ac20: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
ac30: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
ac40: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
ac50: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
ac60: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
ac70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ac80: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
ac90: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
aca0: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
acb0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
acc0: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
acd0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
ace0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
acf0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
ad00: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
ad10: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
ad20: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
ad30: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
ad40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ad50: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
ad60: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
ad70: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
ad80: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
ad90: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
ada0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
adb0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
adc0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
add0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
ade0: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
adf0: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
ae00: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
ae10: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
ae20: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
ae30: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
ae40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae50: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
ae60: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
ae70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
ae80: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
ae90: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
aea0: 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72  int i; .  i64 jr
aeb0: 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e  nlOff;.  i64 jrn
aec0: 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73  lSize;.  u32 cks
aed0: 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  um = 0;.  char z
aee0: 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  Buf[sizeof(aJour
aef0: 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a  nalMagic)+2*4];.
af00: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
af10: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
af20: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
af30: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
af40: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
af50: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
af60: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
af70: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
af80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
af90: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
afa0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
afb0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
afc0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
afd0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
afe0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
aff0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b000: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
b010: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
b020: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
b030: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
b040: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
b050: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
b060: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
b070: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
b080: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
b090: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
b0a0: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
b0b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
b0c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b0d0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
b0e0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
b0f0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
b100: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
b110: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
b120: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b130: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b140: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
b150: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
b160: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b170: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
b180: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
b190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b1a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b1b0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
b1c0: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
b1d0: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
b1e0: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
b1f0: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
b200: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
b210: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
b220: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b230: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
b240: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b250: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
b260: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b270: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
b280: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73    jrnlOff += 8+s
b290: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b2a0: 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  gic);.  pPager->
b2b0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
b2c0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
b2d0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b2e0: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
b2f0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
b300: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
b310: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
b320: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
b330: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b340: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b350: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
b360: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
b370: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
b380: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
b390: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
b3a0: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
b3b0: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
b3c0: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
b3d0: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
b3e0: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
b3f0: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
b400: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
b410: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
b420: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b430: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
b440: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
b450: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
b460: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
b470: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
b480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
b490: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
b4a0: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
b4b0: 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53  */ .  if( (rc==S
b4c0: 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20  QLITE_OK).   && 
b4d0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b4e0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b4f0: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b500: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
b510: 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f  & jrnlSize>jrnlO
b520: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b530: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b540: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b550: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  jrnlOff);.  }.  
b560: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b570: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
b580: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
b590: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
b5a0: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
b5b0: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
b5c0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
b5d0: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
b5e0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
b5f0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
b600: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
b610: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
b620: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
b630: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
b640: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
b650: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
b660: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
b670: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
b680: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
b690: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
b6a0: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
b6b0: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
b6c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b6d0: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
b6e0: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
b6f0: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
b700: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
b710: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b720: 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f  Pager;.  PgHisto
b730: 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
b740: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
b750: 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
b760: 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28  ( MEMDB );.  if(
b770: 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20   !pHist->inStmt 
b780: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b790: 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Hist->pPrevStmt=
b7a0: 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65  =0 && pHist->pNe
b7b0: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  xtStmt==0 );.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74   if( pPager->pSt
b7d0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44  mt ){.      PGHD
b7e0: 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72  R_TO_HIST(pPager
b7f0: 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29  ->pStmt, pPager)
b800: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
b810: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69  g;.    }.    pHi
b820: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
b830: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
b840: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
b850: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73   = pPg;.    pHis
b860: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20  t->inStmt = 1;. 
b870: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   }.}../*.** Find
b880: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
b890: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
b8a0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
b8b0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
b8c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
b8d0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
b8e0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
b8f0: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
b900: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
b910: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
b920: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
b930: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
b940: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b950: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
b960: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
b970: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
b980: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
b990: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
b9a0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
b9b0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
b9c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   p;.}../*.** Cle
b9d0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
b9e0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
b9f0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
ba00: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
ba10: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
ba20: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
ba30: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
ba40: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
ba50: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
ba60: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
ba70: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
ba80: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
ba90: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
baa0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
bab0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
bac0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bad0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
bae0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
baf0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
bb00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bb10: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
bb20: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
bb30: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
bb40: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
bb50: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
bb60: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
bb70: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
bb80: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
bb90: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
bba0: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
bbb0: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
bbc0: 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74  All;.    lruList
bbd0: 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20  Remove(pPg);.   
bbe0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
bbf0: 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  g->pData);.    s
bc00: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
bc10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
bc20: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
bc30: 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t==0);.  assert(
bc40: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
bc50: 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20  stSynced==0);.  
bc60: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
bc70: 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20  ru.pLast==0);.  
bc80: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
bc90: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
bca0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
bcb0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70  >pDirty = 0;.  p
bcc0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
bcd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
bce0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
bcf0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
bd00: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
bd10: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
bd20: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
bd30: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
bd40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bd50: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
bd60: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
bd70: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
bd80: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
bd90: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
bda0: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
bdb0: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
bdc0: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
bdd0: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
bde0: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
bdf0: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
be00: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
be10: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
be20: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
be30: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
be40: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
be50: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
be60: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
be70: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
be80: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
be90: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
bea0: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
beb0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
bec0: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
bed0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
bee0: 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
bef0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
bf00: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
bf10: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
bf20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
bf30: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
bf40: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61   = rc;.      pPa
bf50: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
bf60: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
bf70: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
bf80: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20  pPager))..      
bf90: 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20  /* Always close 
bfa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bfb0: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
bfc0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
bfd0: 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  ..      ** Other
bfe0: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
bff0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
c000: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
c010: 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
c020: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
c030: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
c040: 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  us..      */.   
c050: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c060: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
c070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
c080: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
c090: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
c0a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
c0c0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c0d0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
c0e0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 50  nal);.        pP
c0f0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
c110: 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72       /* If Pager
c120: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
c130: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c140: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c150: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20   cannot be.     
c160: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
c170: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c180: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c190: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
c1a0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  f the.      ** c
c1b0: 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
c1c0: 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72  arded and the er
c1d0: 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20  ror code safely 
c1e0: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
c1f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
c200: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
c210: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c220: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65  QLITE_OK ) pPage
c230: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
c240: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
c250: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
c260: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
c270: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c280: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
c290: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c2a0: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
c2b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
c2c0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c2d0: 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
c2e0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c2f0: 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
c300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c310: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
c320: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
c330: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
c340: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c350: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c360: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c370: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c380: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
c390: 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
c3a0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  open = 0;.      
c3b0: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
c3c0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
c3d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
c3e0: 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65   !MEMDB || pPage
c3f0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
c400: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c410: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
c420: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
c430: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
c440: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
c450: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c460: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
c470: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
c480: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
c490: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
c4a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c4b0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
c4c0: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
c4d0: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
c4e0: 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20  ate, .** do not 
c4f0: 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c  attempt the roll
c500: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
c510: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
c520: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
c530: 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61 73 73 65  r *p){.  /* asse
c540: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
c550: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
c560: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
c570: 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28 20 70 2d  0 ); */.  if( p-
c580: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
c590: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
c5a0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
c5b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61  ){.    sqlite3Fa
c5c0: 75 6c 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 2d  ultBeginBenign(-
c5d0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1);.    sqlite3P
c5e0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
c5f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61 75 6c  .    sqlite3Faul
c600: 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31 29 3b 0a  tEndBenign(-1);.
c610: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
c620: 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20 20 61  ck(p);.#if 0.  a
c630: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
c640: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
c650: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
c660: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
c670: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
c680: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
c690: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
c6a0: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
c6b0: 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64 69 66  veMode );.#endif
c6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c6d0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
c6e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
c6f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
c700: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
c710: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
c720: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
c730: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c740: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
c750: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
c760: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
c770: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
c780: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
c790: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
c7a0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
c7b0: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
c7c0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
c7d0: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
c7e0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
c7f0: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
c800: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
c810: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
c820: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
c830: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
c840: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
c850: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
c860: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
c870: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
c880: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
c890: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
c8a0: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
c8b0: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
c8d0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
c8e0: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
c8f0: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
c900: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
c910: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
c920: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
c930: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
c940: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
c950: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
c960: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
c970: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
c980: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
c990: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
c9a0: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c9c0: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
c9d0: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
c9e0: 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
c9f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ca00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ca10: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
ca20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ca30: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
ca40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
ca50: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
ca60: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
ca70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ca80: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
ca90: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
caa0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
cab0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
cac0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cad0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
cae0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
caf0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
cb00: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
cb10: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
cb20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cb30: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
cb40: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cb50: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
cb60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb70: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb80: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
cb90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
cba0: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
cbb0: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
cbc0: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
cbd0: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
cbe0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cbf0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
cc00: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cc10: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
cc20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc30: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cc40: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cc50: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cc60: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
cc70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cc80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
cc90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
cca0: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
ccb0: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
ccc0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
ccd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
cce0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
ccf0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cd00: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cd10: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cd20: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
cd30: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
cd40: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
cd50: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
cd60: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
cd70: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
cd80: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
cd90: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
cda0: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
cdb0: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
cdc0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
cdd0: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
cde0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
cdf0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
ce00: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
ce10: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
ce20: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
ce30: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
ce40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
ce50: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
ce60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ce70: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
ce80: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
ce90: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cea0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
ceb0: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
cec0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
ced0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
cee0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cef0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
cf00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
cf10: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
cf20: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
cf30: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
cf40: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
cf50: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
cf60: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
cf70: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
cf80: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cf90: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
cfa0: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
cfb0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
cfc0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
cfd0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
cfe0: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  fied = 0;..  ret
cff0: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
d000: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
d010: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
d020: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
d030: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
d040: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
d050: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d060: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
d070: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
d080: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
d090: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
d0a0: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
d0b0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
d0c0: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
d0d0: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
d0e0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
d0f0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
d100: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
d110: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
d120: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
d130: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
d140: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
d150: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
d160: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
d170: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
d180: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
d190: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
d1a0: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
d1b0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
d1c0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
d1d0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
d1e0: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
d1f0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d200: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d210: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d220: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
d230: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
d240: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d250: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d260: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d270: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d280: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d290: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d2a0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d2b0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d2c0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d2d0: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d2e0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d2f0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d300: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
d310: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
d320: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
d330: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
d340: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
d350: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
d360: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
d370: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
d380: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
d390: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
d3a0: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
d3b0: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
d3c0: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
d3d0: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
d3e0: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
d3f0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
d400: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
d410: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
d420: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
d430: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
d440: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
d450: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
d460: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
d470: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
d480: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
d490: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
d4a0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d4b0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d4c0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d4d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d4e0: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
d4f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
d500: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
d510: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
d520: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
d530: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
d540: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d550: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
d560: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
d570: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
d580: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
d590: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
d5a0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
d5b0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
d5c0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
d5d0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
d5e0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
d5f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
d600: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
d610: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
d620: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
d630: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
d640: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
d650: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d660: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
d670: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71  r *pPager, .  sq
d680: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c  lite3_file *jfd,
d690: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20  .  i64 offset,. 
d6a0: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b   int useCksum.){
d6b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
d6c0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
d6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
d6e0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
d6f0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
d700: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d720: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
d730: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
d740: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
d750: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
d770: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
d780: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
d790: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
d7a0: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
d7b0: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
d7c0: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
d7d0: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
d7e0: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
d7f0: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
d800: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
d810: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
d820: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d830: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
d840: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
d850: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
d860: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
d870: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
d880: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
d890: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
d8a0: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
d8b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
d8c0: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
d8d0: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
d8e0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d8f0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
d900: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
d910: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
d920: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
d930: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d940: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d950: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
d960: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
d970: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
d980: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
d990: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
d9a0: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
d9b0: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
d9c0: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
d9d0: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
d9e0: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
d9f0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
da00: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
da10: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
da20: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
da30: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
da40: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
da50: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
da60: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
da70: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
da80: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
da90: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
daa0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
dab0: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
dac0: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
dad0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
dae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
daf0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
db00: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
db10: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
db20: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
db30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
db40: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
db50: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
db60: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
db70: 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t+pPager->pageSi
db80: 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ze+4, &cksum);. 
db90: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
dba0: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
dbb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
dbc0: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
dbd0: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
dbe0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
dbf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
dc00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
dc10: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
dc20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
dc30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
dc40: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
dc50: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
dc60: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
dc70: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
dc80: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
dc90: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
dca0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
dcb0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
dcc0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
dcd0: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
dce0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
dcf0: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
dd00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
dd10: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
dd20: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
dd30: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
dd40: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
dd50: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
dd60: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
dd70: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
dd80: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
dd90: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
dda0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
ddb0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
ddc0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
ddd0: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
dde0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
ddf0: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
de00: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
de10: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
de20: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
de30: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
de40: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
de50: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
de60: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
de70: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
de80: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
de90: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
dea0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
deb0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
dec0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
ded0: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
dee0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
def0: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
df00: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
df10: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
df20: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
df30: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
df40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
df50: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
df60: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
df70: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
df80: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
df90: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
dfa0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
dfb0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
dfc0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
dfd0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
dfe0: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
dff0: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e000: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e010: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e020: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e030: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e040: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e050: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e060: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e070: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
e080: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
e090: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
e0a0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
e0b0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
e0c0: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
e0d0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
e0e0: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
e0f0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
e100: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
e110: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
e120: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
e130: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
e140: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
e150: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
e160: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
e170: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
e180: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
e190: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
e1a0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
e1b0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
e1c0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
e1d0: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
e1e0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
e1f0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e200: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
e210: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
e220: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
e230: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
e240: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
e250: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
e260: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
e270: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
e280: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
e290: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
e2a0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
e2b0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
e2c0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
e2d0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
e2e0: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
e2f0: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
e300: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
e310: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
e320: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
e330: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
e340: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
e350: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
e360: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
e370: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
e380: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
e390: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
e3a0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
e3b0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
e3c0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
e3d0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
e3e0: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
e3f0: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
e400: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
e410: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e420: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
e430: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
e440: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
e450: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
e460: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e470: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
e480: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
e490: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
e4a0: 79 6e 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ync==0).        
e4b0: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
e4c0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
e4d0: 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
e4e0: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
e4f0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
e500: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
e510: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
e520: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e530: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
e540: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
e550: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
e560: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
e570: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
e580: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
e590: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
e5a0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
e5b0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
e5c0: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
e5d0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
e5e0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
e5f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
e600: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
e610: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
e620: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
e630: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
e640: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
e650: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
e660: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
e670: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
e680: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
e690: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
e6a0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
e6b0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
e6c0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
e6d0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
e6e0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
e6f0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
e700: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
e710: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
e720: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
e730: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
e740: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e750: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e760: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
e770: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
e780: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
e790: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e7a0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
e7b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
e7c0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
e7d0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
e7e0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
e7f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
e800: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
e810: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
e820: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
e830: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
e840: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
e850: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
e860: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
e870: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
e880: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
e890: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
e8a0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
e8b0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
e8c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
e8d0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
e8e0: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
e8f0: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
e900: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
e910: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
e920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e930: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
e940: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
e950: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
e960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
e970: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
e980: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
e990: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
e9a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e9b0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
e9c0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
e9d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
e9e0: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
e9f0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
ea00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ea10: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
ea20: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
ea30: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
ea40: 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
ea50: 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
ea60: 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
ea70: 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
ea80: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
ea90: 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
eaa0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  nction..**.**.**
eab0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
eac0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
ead0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
eae0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
eaf0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
eb00: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
eb10: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
eb20: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
eb30: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
eb40: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
eb50: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
eb60: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
eb70: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
eb80: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
eb90: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
eba0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
ebb0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
ebc0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ebd0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
ebe0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ebf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
ec00: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
ec10: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
ec20: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
ec30: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
ec40: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
ec50: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
ec60: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
ec70: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
ec80: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
ec90: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
eca0: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
ecb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
ecc0: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
ecd0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
ece0: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
ecf0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
ed00: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
ed10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ed20: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
ed30: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
ed40: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
ed50: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
ed60: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
ed70: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
ed80: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
ed90: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
eda0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
edb0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
edc0: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
edd0: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
ede0: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
edf0: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
ee00: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
ee10: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
ee20: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
ee30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ee40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
ee50: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
ee60: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
ee70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
ee80: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
ee90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
eea0: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
eeb0: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
eec0: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
eed0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eee0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
eef0: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
ef00: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
ef10: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
ef20: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
ef30: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
ef40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ef50: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
ef60: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
ef70: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
ef80: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
ef90: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
efa0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
efb0: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
efc0: 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  tr = pPager->pVf
efd0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
efe0: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
eff0: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
f000: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
f010: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
f020: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
f030: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
f040: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
f050: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
f060: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
f070: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
f080: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
f090: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
f0a0: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
f0b0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
f0c0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
f0d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f0e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f0f0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f100: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
f110: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
f120: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
f130: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
f140: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
f150: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
f160: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
f170: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
f180: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f190: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
f1a0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
f1b0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
f1c0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
f1d0: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
f1e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
f1f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f210: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f220: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
f230: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b  _ACCESS_EXISTS);
f240: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
f250: 20 26 26 20 72 63 21 3d 31 20 29 7b 0a 20 20 20   && rc!=1 ){.   
f260: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f270: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
f280: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f290: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f2a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
f2b0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
f2c0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
f2d0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
f2e0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
f2f0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
f300: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
f310: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
f320: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
f330: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
f340: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
f350: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
f360: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
f370: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f380: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f390: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
f3a0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
f3b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f3c0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
f3d0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
f3e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f3f0: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
f400: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
f410: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
f420: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
f430: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f440: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f450: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f460: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
f470: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
f480: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
f490: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
f4a0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
f4b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f4c0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
f4d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f4e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f4f0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f500: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
f510: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
f520: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
f530: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
f540: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
f550: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
f560: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
f570: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
f580: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
f590: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f5a0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
f5b0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
f5c0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
f5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f5e0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
f5f0: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
f600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
f610: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f620: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f630: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
f640: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
f650: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
f660: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f670: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
f680: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
f690: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
f6a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
f6b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
f6c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
f6d0: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
f6e0: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
f6f0: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
f700: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
f710: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
f720: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
f730: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
f740: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
f750: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
f760: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
f770: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
f780: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
f790: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
f7a0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20  le..**.** Might 
f7b0: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
f7c0: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
f7d0: 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
f7e0: 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a  er than nPage..*
f7f0: 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  * This can happe
f800: 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
f810: 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65  if we are in the
f820: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61   middle of a tra
f830: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  nsaction.** whic
f840: 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74  h has extended t
f850: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  he file size and
f860: 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61   the new pages a
f870: 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c  re still all hel
f880: 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74  d.** in cache, t
f890: 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  hen an INSERT or
f8a0: 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73   UPDATE does a s
f8b0: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
f8c0: 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72  k.  Some.** oper
f8d0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
f8e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
f8f0: 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
f900: 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74   you try to.** t
f910: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
f920: 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
f930: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f940: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  it currently is,
f950: 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68  .** so detect th
f960: 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
f970: 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
f980: 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
f990: 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69  of the new.** fi
f9a0: 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73  le instead..*/.s
f9b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f9c0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
f9d0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
f9e0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
f9f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
fa00: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
fa10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
fa20: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
fa30: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
fa40: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
fa50: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
fa60: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
fa70: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
fa80: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
fa90: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
faa0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
fab0: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
fac0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
fad0: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
fae0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
faf0: 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
fb00: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
fb10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fb20: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
fb30: 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
fb40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fb50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fb60: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
fb70: 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
fb80: 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
fb90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fba0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fbb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
fbc0: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
fbd0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
fbe0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
fbf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fc00: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fc10: 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20   sectorSize for 
fc20: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
fc30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f  .**.** The secto
fc40: 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61  r size is at lea
fc50: 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65  st as big as the
fc60: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
fc70: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
fc80: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
fc90: 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  ).  The minimum 
fca0: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35  sector size is 5
fcb0: 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
fcc0: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
fcd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
fce0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
fcf0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
fd00: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
fd10: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
fd20: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
fd30: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
fd40: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
fd50: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
fd60: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
fd70: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
fd80: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
fd90: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
fda0: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
fdb0: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
fdc0: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
fdd0: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
fde0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
fdf0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
fe00: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
fe10: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
fe20: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
fe30: 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
fe40: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
fe50: 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = 512;.  }.}../
fe60: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
fe70: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
fe80: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
fe90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
fea0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
feb0: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
fec0: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
fed0: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
fee0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
fef0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
ff00: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
ff10: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
ff20: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
ff30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
ff40: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
ff50: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
ff60: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ff70: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
ff80: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
ff90: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
ffa0: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
ffb0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
ffc0: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
ffd0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
ffe0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
fff0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
10000 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
10010 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
10020 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
10030 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
10040 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
10050 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
10060 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
10070 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
10080 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
10090 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
100a0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
100b0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
100c0 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
100d0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
100e0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
100f0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
10100 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
10110 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
10120 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
10130 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
10140 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
10150 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
10160 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
10170 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
10180 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
10190 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
101a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
101b0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
101c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
101d0 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
101e0 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
101f0 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
10200 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
10210 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
10220 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
10230 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
10240 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10250 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
10260 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
10270 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
10280 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
10290 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
102a0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
102b0 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
102c0 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
102d0 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
102e0 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
102f0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
10300 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
10310 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
10320 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
10330 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
10340 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
10350 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
10360 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
10370 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
10380 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
10390 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
103a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
103b0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
103c0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
103d0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
103e0 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
103f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10400 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
10410 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
10420 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
10430 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
10440 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
10450 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
10460 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
10470 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
10480 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
10490 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
104a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
104b0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
104c0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
104d0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
104e0 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
104f0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
10500 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
10510 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
10530 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
10540 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
10550 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
10560 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
10570 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
10580 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
10590 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
105a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
105b0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
105c0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
105d0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
105e0 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
105f0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
10600 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
10610 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
10620 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
10630 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
10640 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
10650 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
10660 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
10670 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
10680 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
10690 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
106a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
106b0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
106c0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
106d0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
106e0 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
106f0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
10700 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
10710 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
10720 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
10730 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
10740 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
10750 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
10760 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
10770 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
10780 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
10790 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
107a0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
107b0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
107c0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
107d0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
107e0 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
107f0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
10800 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
10810 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
10820 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
10830 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
10840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
10850 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
10860 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
10870 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
10880 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
10890 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
108a0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
108b0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
108c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
108d0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
108e0 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
108f0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
10900 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
10910 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
10920 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
10930 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
10940 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
10950 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
10960 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
10970 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
10980 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
10990 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
109a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
109b0 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
109c0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
109d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
109e0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
109f0 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
10a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10a10 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
10a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
10a30 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
10a40 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
10a50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10a60 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
10a70 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
10a80 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10a90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10aa0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
10ab0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
10ac0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10ad0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
10ae0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
10af0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10b00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10b10 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
10b20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10b30 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20   res = 0;       
10b40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
10b50 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
10b60 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
10b70 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
10b80 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
10b90 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
10ba0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
10bb0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
10bc0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
10bd0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
10be0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
10bf0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
10c00 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
10c10 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
10c20 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10c30 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
10c40 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
10c50 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
10c60 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
10c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
10c80 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
10c90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10ca0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
10cb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10cc0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
10cd0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
10ce0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
10cf0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
10d00 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
10d10 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
10d20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
10d30 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
10d40 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
10d50 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
10d60 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
10d70 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
10d80 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
10d90 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
10da0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
10db0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
10dc0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
10dd0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
10de0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
10df0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
10e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e10 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20 0a  || (zMaster[0] .
10e20 20 20 20 26 26 20 28 72 65 73 3d 73 71 6c 69 74     && (res=sqlit
10e30 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
10e40 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
10e50 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29  _ACCESS_EXISTS))
10e60 3d 3d 30 20 29 20 0a 20 20 29 7b 0a 20 20 20 20  ==0 ) .  ){.    
10e70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
10e80 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10e90 63 6b 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ck;.  }.  zMaste
10ea0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 65 73  r = 0;.  if( res
10eb0 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
10ec0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
10ed0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
10ee0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
10ef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f00 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
10f10 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
10f20 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
10f30 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
10f40 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
10f50 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
10f60 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
10f70 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
10f80 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
10f90 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
10fa0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10fb0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
10fc0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
10fd0 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
10fe0 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
10ff0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
11000 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
11010 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
11020 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
11030 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
11040 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
11050 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
11060 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
11070 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
11080 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
11090 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
110a0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
110b0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
110c0 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
110d0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
110e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
110f0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
11100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
11110 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
11120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11130 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
11140 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11150 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
11160 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
11170 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
11180 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
11190 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
111a0 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
111b0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
111c0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
111d0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
111e0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
111f0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
11200 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
11210 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
11220 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
11230 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
11240 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
11250 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
11260 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
11270 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
11280 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
11290 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
112a0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
112b0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
112c0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
112d0 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
112e0 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
112f0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
11300 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
11310 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
11320 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
11330 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
11340 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
11350 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
11360 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
11370 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
11380 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
11390 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
113a0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
113b0 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
113c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
113d0 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
113e0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
113f0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
11400 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
11410 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11420 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
11430 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
11440 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
11450 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11460 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
11470 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
11480 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
11490 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f  et #2565..    */
114a0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
114b0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
114c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
114d0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
114e0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
114f0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
11500 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
11510 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
11520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
11530 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
11540 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
11550 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
11560 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
11570 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
11580 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
11590 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
115a0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
115b0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
115c0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
115d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
115e0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
115f0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
11600 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
11610 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
11620 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
11630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
11650 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
11660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11670 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
11680 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
11690 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
116a0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
116b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
116c0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
116d0 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
116e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
116f0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
11700 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11710 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11720 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
11730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11760 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
11770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11780 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
11790 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
117a0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
117b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
117c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
117e0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
117f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11800 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
11810 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
11820 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
11830 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
11840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
11850 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
11860 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
11870 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11880 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
11890 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
118a0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
118b0 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66  ame+1);.  }.  if
118c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
118d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
118e0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
118f0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
11900 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d  r[0]!='\0');.  }
11910 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11920 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
11930 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  0] ){.    /* If 
11940 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
11950 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
11960 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11970 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
11980 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
11990 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
119a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
119b0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
119c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
119d0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
119e0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
119f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
11a00 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11a10 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
11a20 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
11a30 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
11a40 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
11a50 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
11a60 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
11a70 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
11a80 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
11a90 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
11aa0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
11ab0 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
11ac0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
11ad0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
11ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11af0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
11b00 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
11b10 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
11b20 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
11b30 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
11b40 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
11b50 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
11b60 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
11b70 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
11b80 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
11b90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
11ba0 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
11bb0 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
11bc0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
11bd0 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
11be0 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
11bf0 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
11c00 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
11c10 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
11c20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
11c30 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
11c40 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11c50 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
11c60 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
11c70 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
11c80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
11c90 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
11ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
11cb0 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
11cc0 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
11cd0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
11ce0 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
11cf0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
11d00 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
11d10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11d20 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
11d30 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
11d40 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d60 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
11d70 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11da0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
11db0 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
11dc0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
11dd0 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
11de0 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
11df0 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
11e00 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
11e10 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
11e20 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
11e30 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
11e40 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
11e50 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
11e60 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
11e70 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
11e80 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
11e90 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
11ea0 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
11eb0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
11ec0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
11ed0 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
11ee0 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
11ef0 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
11f00 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
11f10 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
11f20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
11f30 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
11f40 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
11f50 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
11f60 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
11f70 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
11f80 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
11f90 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
11fa0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11fb0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
11fc0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
11fd0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
11fe0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
11ff0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
12000 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12010 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
12020 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
12030 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52  rnalOpen );.  nR
12040 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
12050 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
12060 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
12070 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
12080 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
12090 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
120a0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
120b0 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
120c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
120d0 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
120e0 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
120f0 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
12100 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
12110 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
12120 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
12130 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
12140 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
12150 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
12160 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ++){.    i64 off
12170 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65  set = i*(4+pPage
12180 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
12190 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
121a0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
121b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
121c0 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b  tfd, offset, 0);
121d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
121e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
121f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12200 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
12210 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
12220 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
12230 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
12240 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
12250 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
12260 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
12270 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
12280 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
12290 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
122a0 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
122b0 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
122c0 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
122d0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
122e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
122f0 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
12300 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
12310 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
12320 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
12330 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
12340 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
12350 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
12360 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
12370 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
12380 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
12390 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
123a0 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
123b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
123c0 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  n..  */.  pPager
123d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
123e0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
123f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
12400 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
12410 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
12420 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
12430 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
12440 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
12450 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
12460 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
12470 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12480 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
12490 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
124a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
124b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
124c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
124d0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
124e0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
124f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12500 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
12510 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20  2 nJRec;        
12520 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
12530 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
12540 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
12550 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
12560 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
12570 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
12580 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
12590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
125a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
125b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
125c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
125d0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
125e0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65    }.    if( nJRe
125f0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
12600 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
12610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
12620 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
12630 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
12640 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31     for(i=nJRec-1
12650 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
12660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
12670 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
12680 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
12690 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
126a0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
126b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
126c0 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
126d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
126e0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
126f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12700 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
12710 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
12720 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
12730 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
12740 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
12750 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
12760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
12770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
12780 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
12790 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
127a0 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
127b0 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
127c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
127d0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
127e0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
127f0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
12800 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
12810 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
12820 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
12830 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12840 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
12850 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
12860 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
12870 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
12880 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
12890 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
128a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
128b0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
128c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
128d0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
128e0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
128f0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
12900 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
12910 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
12920 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
12930 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
12940 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
12950 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
12960 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
12970 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
12980 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
12990 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
129a0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
129b0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
129c0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
129d0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
129e0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
129f0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
12a00 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
12a10 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
12a20 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12a30 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12a40 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
12a50 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
12a60 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
12a80 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
12a90 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
12aa0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
12ab0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12ac0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
12ad0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
12ae0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
12af0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12b00 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
12b10 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
12b20 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
12b30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
12b50 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
12b60 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
12b70 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
12b80 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
12b90 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
12ba0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
12bb0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12bc0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
12bd0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
12be0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
12bf0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
12c00 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
12c10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12c20 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
12c30 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
12c40 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
12c50 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
12c60 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
12c70 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
12c80 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
12c90 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
12ca0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
12cb0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
12cc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12cd0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
12ce0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
12cf0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
12d00 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
12d10 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
12d20 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
12d30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12d40 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
12d50 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
12d60 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
12d70 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
12d80 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
12d90 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
12da0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
12db0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
12dc0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
12dd0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
12de0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
12df0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12e00 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
12e10 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
12e20 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
12e30 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
12e40 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
12e50 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
12e60 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
12e70 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12e80 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
12e90 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63  gs = (full_fsync
12ea0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
12eb0 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
12ec0 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
12ed0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
12ee0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
12ef0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
12f00 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
12f10 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
12f20 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
12f30 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
12f40 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
12f50 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
12f60 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
12f70 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
12f80 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
12f90 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
12fa0 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
12fb0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12fc0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
12fd0 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
12fe0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
12ff0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
13000 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
13010 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
13020 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
13030 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13040 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
13050 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
13060 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
13070 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
13080 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13090 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
130a0 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  ary.** file when
130b0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
130c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
130d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
130e0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p(.  sqlite3_vfs
130f0 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68   *pVfs,    /* Th
13100 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
13110 79 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20  ystem layer */. 
13120 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
13130 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
13140 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
13150 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  tor here */.  ch
13160 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
13170 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13180 68 65 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20  he file.  Might 
13190 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
131a0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
131b0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
131c0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
131d0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
131e0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
131f0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
13200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13210 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
13220 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
13230 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
13240 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
13250 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
13260 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
13270 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13280 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
13290 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
132a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
132b0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
132c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
132d0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
132e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
132f0 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  n(pVfs, zFilenam
13300 65 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  e, pFile, vfsFla
13310 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
13320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13330 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
13340 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
13350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
13360 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
13370 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
13380 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
13390 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
133a0 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
133b0 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
133c0 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
133d0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
133e0 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
133f0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
13400 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
13410 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
13420 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
13430 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
13440 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
13450 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
13460 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
13470 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
13480 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
13490 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
134a0 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
134b0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
134c0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
134d0 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
134e0 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
134f0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
13500 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
13510 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
13520 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
13530 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
13540 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
13550 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
13560 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
13570 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
13580 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
13590 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
135a0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
135b0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
135c0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
135d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
135e0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
135f0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
13600 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
13610 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
13620 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
13630 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
13640 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
13650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13660 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
13670 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
13680 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
13690 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
136a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
136b0 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
136c0 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
136d0 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
136e0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
136f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
13700 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
13710 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
13720 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
13730 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
13740 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
13750 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
13760 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38  pen() */.){.  u8
13770 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
13780 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  *pPager = 0;.  i
13790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
137a0 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
137b0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
137c0 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
137d0 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
137e0 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
137f0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
13800 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
13810 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
13820 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
13830 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
13840 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e  ADLOCK)!=0;.  in
13850 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
13860 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
13870 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
13880 69 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65  int nDefaultPage
13890 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
138a0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
138b0 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a  har *zPathname;.
138c0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b    int nPathname;
138d0 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72  .  char *zStmtJr
138e0 6e 6c 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 4a  nl;.  int nStmtJ
138f0 72 6e 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  rnl;..  /* The d
13900 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73  efault return is
13910 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
13920 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
13930 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
13940 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
13950 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e 61 6d  me */.  nPathnam
13960 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
13970 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74 68 6e  name+1;.  zPathn
13980 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
13990 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
139a0 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  );.  if( zPathna
139b0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
139c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
139d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
139e0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
139f0 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
13a00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
13a10 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
13a20 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
13a30 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
13a40 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
13a50 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
13a60 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
13a70 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
13a80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13a90 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
13aa0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
13ab0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
13ac0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
13ad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
13ae0 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65  = sqlite3OsGetTe
13af0 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61  mpname(pVfs, nPa
13b00 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
13b10 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
13b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13b30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13b40 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13b60 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72   nPathname = str
13b70 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  len(zPathname);.
13b80 0a 20 20 2f 2a 20 50 75 74 20 74 68 65 20 73 74  .  /* Put the st
13b90 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
13ba0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 69 73  in temporary dis
13bb0 6b 20 73 70 61 63 65 20 73 69 6e 63 65 20 74 68  k space since th
13bc0 69 73 20 69 73 0a 20 20 2a 2a 20 73 6f 6d 65 74  is is.  ** somet
13bd0 69 6d 65 73 20 52 41 4d 20 64 69 73 6b 20 6f 72  imes RAM disk or
13be0 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 65 64   other optimized
13bf0 20 73 74 6f 72 61 67 65 2e 20 20 55 6e 6c 69 6b   storage.  Unlik
13c00 65 6c 79 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a  ely the main.  *
13c10 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  * main journal f
13c20 69 6c 65 2c 20 74 68 65 20 73 74 61 74 65 6d 65  ile, the stateme
13c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
13c40 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 0a  not need to be .
13c50 20 20 2a 2a 20 63 6f 6c 6f 63 61 74 65 64 20 77    ** colocated w
13c60 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
13c70 20 6e 6f 72 20 64 6f 65 73 20 69 74 20 6e 65 65   nor does it nee
13c80 64 20 74 6f 20 62 65 20 70 65 72 73 69 73 74 65  d to be persiste
13c90 6e 74 2e 0a 20 20 2a 2f 0a 20 20 7a 53 74 6d 74  nt..  */.  zStmt
13ca0 4a 72 6e 6c 20 3d 20 26 7a 50 61 74 68 6e 61 6d  Jrnl = &zPathnam
13cb0 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a  e[nPathname+1];.
13cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13cd0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
13ce0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
13cf0 6d 65 2b 31 2c 20 7a 53 74 6d 74 4a 72 6e 6c 29  me+1, zStmtJrnl)
13d00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13d20 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13d30 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13d40 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 53 74 6d 74   rc;.  }.  nStmt
13d50 4a 72 6e 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 53  Jrnl = strlen(zS
13d60 74 6d 74 4a 72 6e 6c 29 3b 0a 0a 20 20 2f 2a 20  tmtJrnl);..  /* 
13d70 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
13d80 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74  for the pager st
13d90 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61  ructure */.  pPa
13da0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ger = sqlite3Mal
13db0 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a  locZero(.    siz
13dc0 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20  eof(*pPager) +  
13dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
13de0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
13df0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
13e00 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ze +           /
13e10 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
13e20 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20  le structure */ 
13e30 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46  .    pVfs->szOsF
13e40 69 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20  ile * 3 +       
13e50 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
13e60 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  and two journal 
13e70 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a  files */ .    3*
13e80 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 2b  nPathname + 40 +
13e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
13ea0 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
13eb0 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  ry, zJournal */.
13ec0 20 20 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 20 20      nStmtJrnl   
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 2f 2a 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a  /* zStmtJrnl */.
13ef0 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67    );.  if( !pPag
13f00 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
13f10 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
13f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13f30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13f40 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26    pPtr = (u8 *)&
13f50 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
13f60 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
13f70 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67  vfsFlags;.  pPag
13f80 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65  er->fd = (sqlite
13f90 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
13fa0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b  fs->szOsFile*0];
13fb0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20  .  pPager->stfd 
13fc0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
13fd0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
13fe0 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67  sFile*1];.  pPag
13ff0 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74  er->jfd = (sqlit
14000 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
14010 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d  Vfs->szOsFile*2]
14020 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
14030 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
14040 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
14050 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c  ile*2+journalFil
14060 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72  eSize];.  pPager
14070 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
14080 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14090 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a  e[nPathname+1];.
140a0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
140b0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
140c0 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61  irectory[nPathna
140d0 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
140e0 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50  >zStmtJrnl = &pP
140f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
14100 50 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20  Pathname+10];.  
14110 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
14120 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50  Vfs;.  memcpy(pP
14130 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14140 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
14150 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 6d 65 6d 63  hname+1);.  memc
14160 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  py(pPager->zStmt
14170 4a 72 6e 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 2c  Jrnl, zStmtJrnl,
14180 20 6e 53 74 6d 74 4a 72 6e 6c 2b 31 29 3b 0a 20   nStmtJrnl+1);. 
14190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
141a0 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
141b0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
141c0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
141d0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
141e0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
141f0 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  mDb ){.    if( n
14200 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e  Pathname>(pVfs->
14210 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a  mxPathname - siz
14220 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  eof("-journal"))
14230 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14240 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
14250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14260 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
14270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14280 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
14290 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
142a0 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
142d0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
142e0 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
142f0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
14300 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
14310 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
14320 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
14330 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
14340 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
14350 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  s,.      ** choo
14360 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
14370 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
14380 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
14390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
143a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
143b0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
143c0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
143d0 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  m of:.      **. 
143e0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c       **    + SQL
143f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
14400 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20  _SIZE,.      ** 
14410 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
14420 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
14430 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
14440 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
14450 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
14460 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
14470 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
14480 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lly..      */.  
14490 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
144a0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
144b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ly ){.        in
144c0 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20  t iSectorSize = 
144d0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
144e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
144f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
14500 66 61 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f  faultPage<iSecto
14510 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
14520 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20     nDefaultPage 
14530 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
14540 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
14550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
14560 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
14570 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
14580 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
14590 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
145a0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
145b0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fd);.          i
145c0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
145d0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
145e0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
145f0 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
14600 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
14610 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
14620 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
14630 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14640 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
14650 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
14660 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
14670 20 20 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c    for(ii=nDefaul
14680 74 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54  tPage; ii<=SQLIT
14690 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
146a0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
146b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
146c0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
146d0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
146e0 3e 38 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50  >8)) ) nDefaultP
146f0 61 67 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  age = ii;.      
14700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14710 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
14720 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e  f( nDefaultPage>
14730 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14740 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
14750 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75            nDefau
14760 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f  ltPage = SQLITE_
14770 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
14780 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
14790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
147a0 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44   }else if( !memD
147b0 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  b ){.    /* If a
147c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
147d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
147e0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
147f0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
14800 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
14810 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
14820 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
14830 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
14840 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
14850 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
14860 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
14870 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
14880 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
14890 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
148a0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
148b0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
148c0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26  ..  if( pPager &
148d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
148e0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
148f0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14900 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 44 65  e3MallocZero(nDe
14910 66 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a  faultPage);.  }.
14920 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
14930 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
14940 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
14950 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72  s above..  ** Fr
14960 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
14970 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
14980 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20   the file..  ** 
14990 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
149a0 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  is not allocated
149b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
149c0 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61  d to set .  ** a
149d0 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  ny Pager.errMask
149e0 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f   variables..  */
149f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c  .  if( !pPager |
14a00 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
14a10 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  pace ){.    sqli
14a20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14a30 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
14a40 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
14a50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
14a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
14a70 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
14a80 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
14a90 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
14aa0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
14ab0 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
14ac0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
14ad0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
14ae0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
14af0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
14b00 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69  ename))..  /* Fi
14b10 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72  ll in Pager.zDir
14b20 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65  ectory[] */.  me
14b30 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  mcpy(pPager->zDi
14b40 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d  rectory, pPager-
14b50 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
14b60 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  hname+1);.  for(
14b70 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d  i=strlen(pPager-
14b80 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e  >zDirectory); i>
14b90 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
14ba0 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
14bb0 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
14bc0 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
14bd0 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
14be0 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  0;..  /* Fill in
14bf0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b   Pager.zJournal[
14c00 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
14c10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
14c20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14c30 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
14c40 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
14c50 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
14c60 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
14c70 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  , 9);..  /* pPag
14c80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14c90 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14ca0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
14cb0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
14cc0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
14cd0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
14ce0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
14cf0 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
14d00 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
14d10 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
14d20 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
14d30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
14d40 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
14d50 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
14d60 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
14d70 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66  >pageSize = nDef
14d80 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70  aultPage;.  /* p
14d90 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
14da0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14db0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14dc0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14dd0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
14de0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
14df0 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
14e00 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
14e10 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
14e20 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
14e30 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
14e40 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
14e50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14e60 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
14e70 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14e80 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
14e90 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
14ea0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
14eb0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
14ec0 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
14ed0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
14ee0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14ef0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
14f00 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
14f10 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
14f20 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
14f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
14f40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14f50 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
14f60 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
14f70 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
14f80 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
14f90 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
14fa0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
14fb0 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
14fc0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
14fd0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
14fe0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
14ff0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
15000 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
15010 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15020 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
15030 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
15040 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15050 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15060 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
15070 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
15080 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
15090 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
150a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
150b0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
150c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
150d0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
150e0 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65  (nExtra);.  asse
150f0 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
15100 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c  Methods||memDb||
15110 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15120 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
15130 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15140 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
15150 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
15160 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
15170 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
15180 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
15190 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
151a0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
151b0 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
151c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
151d0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
151e0 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
151f0 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  eMM = 0;.  pPage
15200 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  r->iInUseDB = 0;
15210 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
15220 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15230 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
15240 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
15250 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
15260 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
15270 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
15280 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  M2);.#endif.    
15290 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
152a0 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
152b0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
152c0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
152d0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
152e0 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20  3PagerList ){.  
152f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15300 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50  te3PagerList->pP
15310 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rev==0 );.      
15320 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
15330 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72  ->pPrev = pPager
15340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
15350 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  er->pPrev = 0;. 
15360 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
15370 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ist = pPager;.  
15380 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15390 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
153a0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
153b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
153c0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
153d0 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
153e0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
153f0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
15400 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
15410 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
15420 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
15430 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
15440 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
15450 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
15460 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
15470 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
15480 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
15490 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
154a0 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
154b0 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
154c0 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
154d0 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
154e0 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
154f0 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
15500 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
15510 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
15520 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
15530 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
15540 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
15550 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
15560 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
15570 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
15580 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
15590 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
155a0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
155b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
155c0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
155d0 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
155e0 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
155f0 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
15600 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
15610 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
15620 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
15630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15640 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
15650 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
15660 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
15670 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
15680 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
15690 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
156a0 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
156b0 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
156c0 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
156d0 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
156e0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
156f0 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
15700 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
15710 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
15720 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
15730 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
15740 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
15750 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
15760 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
15770 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15780 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
15790 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
157a0 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
157b0 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
157c0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
157d0 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
157e0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
157f0 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65  e size to *pPage
15800 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67  Size. If the sug
15810 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69  gest new page si
15820 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f  ze is.** inappro
15830 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
15840 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
15850 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
15860 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  that.** value be
15870 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
15890 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
158a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
158b0 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20  6 *pPageSize){. 
158c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
158d0 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53  _OK;.  u16 pageS
158e0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
158f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
15900 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
15910 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
15920 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
15930 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
15940 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
15950 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
15960 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
15970 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
15980 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
15990 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  ef==0 .  ){.    
159a0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
159b0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
159c0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
159d0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
159e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
159f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
15a00 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45  se{.      pagerE
15a10 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
15a20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15a30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
15a40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15a50 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
15a60 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
15a70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15a80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
15a90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
15aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
15ab0 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
15ac0 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
15ad0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
15ae0 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65    }.  *pPageSize
15af0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
15b00 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ize;.  return rc
15b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15b20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
15b30 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
15b40 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
15b50 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
15b60 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
15b70 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
15b80 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
15b90 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
15ba0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
15bb0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
15bc0 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
15bd0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
15be0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
15bf0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
15c00 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
15c10 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
15c20 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
15c30 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
15c40 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
15c50 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
15c60 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
15c70 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
15c80 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
15c90 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
15ca0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15cb0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15cc0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
15cd0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
15ce0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
15cf0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
15d00 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
15d10 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
15d20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
15d30 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
15d40 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
15d50 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
15d60 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
15d70 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
15d80 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
15d90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15da0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
15db0 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
15dc0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
15dd0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
15de0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
15df0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
15e00 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
15e10 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
15e20 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
15e30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15e40 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
15e50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
15e60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
15e70 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
15e80 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
15e90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
15ea0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
15eb0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
15ec0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
15ed0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
15ee0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
15ef0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
15f00 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
15f10 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
15f20 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
15f30 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
15f40 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
15f50 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
15f60 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
15f70 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
15f80 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
15f90 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
15fa0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
15fb0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15fc0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
15fd0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15fe0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
15ff0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
16000 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
16010 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
16020 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
16030 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
16040 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
16050 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
16060 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
16070 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
16080 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
16090 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
160a0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
160b0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
160c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
160d0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
160e0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
160f0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
16100 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
16110 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
16120 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
16130 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
16140 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
16150 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
16160 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
16170 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
16180 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
16190 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
161a0 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
161b0 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
161c0 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
161d0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
161e0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
161f0 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
16200 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
16210 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
16220 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
16230 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
16240 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
16250 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
16260 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
16270 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
16280 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
16290 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
162a0 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
162b0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
162c0 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
162d0 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
162e0 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
162f0 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
16300 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
16310 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e  out this)..*/.in
16320 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
16330 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
16340 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16350 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
16360 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
16370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16380 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
16390 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
163a0 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66  MEMDB||pPager->f
163b0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
163c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
163d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
163e0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
163f0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
16400 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
16410 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
16420 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16430 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
16440 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
16450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16460 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
16470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16480 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16490 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
164a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
164b0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
164c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
164d0 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
164e0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
164f0 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
16500 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
16510 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
16520 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
16530 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
16540 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
16550 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
16560 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
16570 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
16580 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
16590 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
165a0 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
165b0 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
165c0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
165d0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
165e0 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
165f0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
16600 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
16610 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
16620 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
16630 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20  {.  i64 n = 0;. 
16640 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
16650 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
16660 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16670 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
16680 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  urn -1;.  }.  if
16690 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
166a0 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
166b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
166c0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73   } else {.    as
166d0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
166e0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
166f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
16700 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66    if( (pPager->f
16710 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20  d->pMethods).   
16720 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
16730 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
16740 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
16750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16760 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16770 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
16780 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16790 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
167a0 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74  Ref--;.      ret
167b0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
167c0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
167d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
167e0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
167f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16800 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
16810 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
16820 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
16830 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
16840 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
16850 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
16860 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
16870 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
16880 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16890 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
168a0 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
168b0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
168c0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
168d0 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
168e0 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   n;.}...#ifndef 
168f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
16900 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  RYDB./*.** Clear
16910 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
16920 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
16930 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
16940 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
16950 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
16960 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
16970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16980 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
16990 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
169a0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
169b0 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
169c0 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
169d0 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
169e0 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
169f0 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
16a00 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
16a10 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
16a20 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
16a30 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
16a40 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
16a50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
16a60 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
16a70 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
16a80 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
16a90 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
16aa0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
16ab0 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
16ac0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16ad0 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
16ae0 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
16af0 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
16b00 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
16b10 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
16b20 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
16b30 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
16b40 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
16b50 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
16b60 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
16b70 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
16b80 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
16b90 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
16ba0 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
16bb0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
16bc0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
16bd0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
16be0 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
16bf0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
16c00 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
16c10 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
16c20 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
16c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16c40 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
16c50 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
16c60 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
16c70 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
16c80 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
16c90 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
16ca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16cb0 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
16cc0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
16cd0 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
16ce0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
16cf0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
16d00 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
16d10 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
16d20 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
16d30 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
16d40 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
16d50 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
16d60 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
16d70 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
16d80 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
16d90 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
16da0 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
16db0 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
16dc0 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
16dd0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
16de0 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
16df0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
16e00 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
16e10 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
16e20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16e30 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ager;..  /* Unli
16e40 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67  nk from free pag
16e50 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c  e list */.  lruL
16e60 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a  istRemove(pPg);.
16e70 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
16e80 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
16e90 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
16ea0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
16eb0 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r, pPg);.}../*.*
16ec0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
16ed0 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
16ee0 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65  te the cache whe
16ef0 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  n a database.** 
16f00 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44  is truncated.  D
16f10 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63  rop from the cac
16f20 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  he all pages who
16f30 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61  se pgno is.** la
16f40 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
16f50 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
16f60 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
16f70 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
16f80 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
16f90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16fa0 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
16fb0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74  * Actually, at t
16fc0 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
16fd0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
16fe0 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20   it would be.** 
16ff0 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  an error to have
17000 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61   a referenced pa
17010 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20  ge.  But rather 
17020 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74  than delete.** t
17030 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61  hat page and gua
17040 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75  rantee a subsequ
17050 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74  ent segfault, it
17060 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a   seems better.**
17070 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20   to zero it and 
17080 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72  hope that we err
17090 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a  or out sanely..*
170a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
170b0 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
170c0 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
170d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
170e0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
170f0 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
17100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
17110 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
17120 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
17130 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
17140 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
17150 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
17160 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
17170 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
17180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
17190 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
171a0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
171b0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
171c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
171d0 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
171e0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
171f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17200 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
17210 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49  NextAll;.      I
17220 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
17230 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17240 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
17250 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
17260 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
17270 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
17280 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
17290 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
172a0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
172b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
172c0 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
172d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
172e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
172f0 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
17300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
17310 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
17320 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e  k on a file.  In
17330 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
17340 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
17350 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ck.** is current
17360 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
17370 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
17380 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
17390 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c  k returns.** fal
173a0 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
173b0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
173c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
173d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
173e0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
173f0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
17400 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
17410 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
17420 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
17430 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
17440 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
17450 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
17460 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76  /* The OS lock v
17470 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68  alues must be th
17480 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61  e same as the Pa
17490 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20  ger lock values 
174a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  */.  assert( PAG
174b0 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45  ER_SHARED==SHARE
174c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
174d0 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56  rt( PAGER_RESERV
174e0 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ED==RESERVED_LOC
174f0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
17500 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d  AGER_EXCLUSIVE==
17510 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17520 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
17530 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
17540 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74   unlocked then t
17550 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  he size must be 
17560 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73  unknown */.  ass
17570 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17580 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
17590 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
175a0 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ze<0 || MEMDB );
175b0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
175c0 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
175d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
175e0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
175f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17600 70 42 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70  pBusyHandler ) p
17610 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
17620 6c 65 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a  ler->nBusy = 0;.
17630 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
17640 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
17650 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
17660 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
17670 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
17680 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49  BUSY && sqlite3I
17690 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
176a0 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
176b0 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66  ndler) );.    if
176c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
176d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
176e0 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70  >state = locktyp
176f0 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
17700 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
17710 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
17720 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
17730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17740 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
17750 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
17760 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
17770 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
17780 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
17790 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
177a0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
177b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
177c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
177d0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
177e0 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73   || MEMDB );.  s
177f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
17800 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
17810 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
17820 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
17830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
17840 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17850 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17860 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
17870 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
17880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17890 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  K;.  }.  if( MEM
178a0 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
178b0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
178c0 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
178d0 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
178e0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
178f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17900 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
17910 72 29 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a  r);.  rc = syncJ
17920 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
17930 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
17940 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
17950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17970 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
17980 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
17990 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
179a0 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
179b0 2f 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  /.  pagerEnter(p
179c0 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
179d0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
179e0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
179f0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67  IVE_LOCK);.  pag
17a00 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
17a10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17a30 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63  rn rc;.  }..  rc
17a40 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
17a50 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  e(pPager, nPage)
17a60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17a70 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
17a80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
17a90 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
17aa0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
17ab0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
17ac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
17ad0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
17ae0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
17af0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
17b00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
17b10 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
17b20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
17b30 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
17b40 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
17b50 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
17b60 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
17b70 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
17b80 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
17b90 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
17ba0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
17bb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
17bc0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
17bd0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
17be0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
17bf0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
17c00 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
17c10 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
17c20 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
17c30 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
17c40 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
17c50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
17c60 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
17c70 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
17c80 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
17c90 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
17ca0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
17cb0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
17cc0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
17cd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
17ce0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
17cf0 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  er){.#ifdef SQLI
17d00 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
17d10 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
17d20 28 20 21 4d 45 4d 44 42 20 29 7b 0a 23 69 66 6e  ( !MEMDB ){.#ifn
17d30 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
17d40 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65  _NOOP.    sqlite
17d50 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d  3_mutex *mutex =
17d60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
17d70 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
17d80 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
17d90 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
17da0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
17db0 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  utex);.    if( p
17dc0 50 61 67 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a  Pager->pPrev ){.
17dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50        pPager->pP
17de0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  rev->pNext = pPa
17df0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
17e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
17e10 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20  ite3PagerList = 
17e20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
17e30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17e40 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ger->pNext ){.  
17e50 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78      pPager->pNex
17e60 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65  t->pPrev = pPage
17e70 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
17e80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
17e90 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a  x_leave(mutex);.
17ea0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69    }.#endif..  di
17eb0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
17ec0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
17ed0 71 6c 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e  qlite3FaultBegin
17ee0 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 70 50  Benign(-1);.  pP
17ef0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
17f00 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
17f10 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
17f20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17f30 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e  ager);.  pagerUn
17f40 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
17f50 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c  pPager);.  enabl
17f60 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17f70 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
17f80 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e  e3FaultEndBenign
17f90 28 2d 31 29 3b 0a 20 20 50 41 47 45 52 54 52 41  (-1);.  PAGERTRA
17fa0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
17fb0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17fc0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
17fd0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
17fe0 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61 67  ger)).  if( pPag
17ff0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18000 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
18010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
18020 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
18030 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
18040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
18050 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
18060 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
18070 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18080 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
18090 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
180a0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
180b0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
180c0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
180d0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
180e0 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
180f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18100 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
18110 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
18120 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
18130 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
18140 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
18150 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
18160 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
18170 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
18180 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
18190 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
181a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
181b0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
181c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
181d0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
181e0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
181f0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
18200 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
18210 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
18220 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
18230 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
18240 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
18250 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
18260 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
18270 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
18280 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
18290 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
182a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
182b0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
182c0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
182d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
182e0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
182f0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
18300 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
18310 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
18320 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
18330 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
18340 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
18350 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
18360 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
18370 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
18380 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
18390 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
183a0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
183b0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
183c0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
183d0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
183e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
183f0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
18400 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
18410 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
18420 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
18430 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
18440 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
18450 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c  ove it. */.    l
18460 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
18470 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
18480 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
18490 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d    pPg->nRef++;.}
184a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
184b0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
184c0 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
184d0 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
184e0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
184f0 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
18500 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
18510 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
18520 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  f++;.    }.  }.#
18530 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
18540 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
18550 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
18560 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
18570 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
18580 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
18590 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
185a0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
185b0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
185c0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
185d0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
185e0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
185f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
18600 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
18610 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
18620 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f  pPager);.  page_
18630 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ref(pPg);.  page
18640 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67  rLeave(pPg->pPag
18650 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
18660 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18670 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
18680 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
18690 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
186a0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
186b0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
186c0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
186d0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
186e0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
186f0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
18700 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
18710 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
18720 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
18730 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
18740 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
18750 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
18760 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
18770 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
18780 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
18790 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
187a0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
187b0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
187c0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
187d0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
187e0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
187f0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
18800 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
18810 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
18820 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
18830 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
18840 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18850 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
18860 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
18870 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
18880 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18890 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
188a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
188b0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
188c0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
188d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
188e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
188f0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
18900 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
18910 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
18920 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
18930 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
18940 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
18950 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
18960 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
18970 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
18980 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
18990 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
189a0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
189b0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
189c0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
189d0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
189e0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
189f0 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
18a00 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
18a10 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
18a20 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
18a30 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
18a40 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
18a50 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
18a60 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
18a70 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
18a80 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
18a90 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
18aa0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
18ab0 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
18ac0 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
18ad0 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
18ae0 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
18af0 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
18b00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
18b10 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
18b20 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
18b30 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
18b40 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
18b50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18b60 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
18b70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
18b80 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
18b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18ba0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
18bb0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
18bc0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
18bd0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
18be0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
18bf0 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
18c00 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
18c10 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
18c20 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
18c30 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
18c40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18c50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
18c60 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
18c70 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
18c80 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
18c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18ca0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18cb0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
18cc0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
18cd0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
18ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18cf0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
18d00 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
18d10 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
18d20 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
18d30 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
18d40 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
18d50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
18d60 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
18d70 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
18d80 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
18d90 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
18da0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
18db0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
18dc0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
18dd0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
18de0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
18df0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
18e00 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
18e10 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
18e20 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
18e30 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
18e40 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
18e50 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
18e60 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
18e70 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
18e80 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
18e90 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
18ea0 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
18eb0 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
18ec0 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
18ed0 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
18ee0 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
18ef0 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
18f00 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
18f10 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
18f20 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
18f30 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
18f40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18f50 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a     i64 jrnlOff;.
18f60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
18f70 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
18f80 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
18f90 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
18fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
18fb0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
18fc0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
18fd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18fe0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
18ff0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
19000 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
19010 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19020 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
19030 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
19040 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
19050 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
19060 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19080 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
19090 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
190a0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
190b0 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49  agic);.        I
190c0 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
190d0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
190e0 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29  ger, jrnlOff, 4)
190f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19100 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
19110 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
19120 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
19130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
19140 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
19160 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
19170 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
19180 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
19190 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
191a0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
191b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
191c0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
191d0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
191e0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
191f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
19200 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
19210 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
19220 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
19230 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
19240 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
19250 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
19260 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
19270 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
19280 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
19290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
192a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
192b0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
192c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
192d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
192e0 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
192f0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
19300 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
19310 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
19320 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
19330 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
19340 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
19350 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19360 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
19370 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
19380 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20  ynced(pPager);. 
19390 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
193a0 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
193b0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
193c0 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
193d0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
193e0 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
193f0 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
19400 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
19410 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
19420 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
19430 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
19440 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
19450 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
19460 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
19470 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
19480 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
19490 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
194a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
194b0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
194c0 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
194d0 6c 72 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20  lru.pFirst );.  
194e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
194f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19500 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20  Merge two lists 
19510 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  of pages connect
19520 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64  ed by pDirty and
19530 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a   in pgno order..
19540 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66  ** Do not both f
19550 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44  ixing the pPrevD
19560 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a  irty pointers..*
19570 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
19580 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50  merge_pagelist(P
19590 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20  gHdr *pA, PgHdr 
195a0 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65  *pB){.  PgHdr re
195b0 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20  sult, *pTail;.  
195c0 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b  pTail = &result;
195d0 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
195e0 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
195f0 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20  ->pgno<pB->pgno 
19600 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  ){.      pTail->
19610 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20  pDirty = pA;.   
19620 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20     pTail = pA;. 
19630 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44       pA = pA->pD
19640 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
19650 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
19660 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20  irty = pB;.     
19670 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20   pTail = pB;.   
19680 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72     pB = pB->pDir
19690 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ty;.    }.  }.  
196a0 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54  if( pA ){.    pT
196b0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
196c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
196d0 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
196e0 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65  Dirty = pB;.  }e
196f0 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  lse{.    pTail->
19700 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  pDirty = 0;.  }.
19710 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e    return result.
19720 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
19730 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f   Sort the list o
19740 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  f pages in accen
19750 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67  ding order by pg
19760 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a  no.  Pages are.*
19770 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  * connected by p
19780 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20  Dirty pointers. 
19790 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20   The pPrevDirty 
197a0 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20  pointers are.** 
197b0 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69  corrupted by thi
197c0 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69  s sort..*/.#defi
197d0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
197e0 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e  _ALLOC 25.#defin
197f0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
19800 20 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20        25.#ifdef 
19810 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
19820 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
19830 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20  n_sort_bucket = 
19840 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f  0;.  #undef N_SO
19850 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66  RT_BUCKET.  #def
19860 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
19870 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f  T \.   (sqlite3_
19880 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
19890 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65  ket?sqlite3_page
198a0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a  r_n_sort_bucket:
198b0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
198c0 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  LOC).#endif.stat
198d0 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70  ic PgHdr *sort_p
198e0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
198f0 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b  In){.  PgHdr *a[
19900 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
19910 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20  LOC], *p;.  int 
19920 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30  i;.  memset(a, 0
19930 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20  , sizeof(a));.  
19940 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20  while( pIn ){.  
19950 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70    p = pIn;.    p
19960 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  In = p->pDirty;.
19970 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
19980 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
19990 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  i<N_SORT_BUCKET-
199a0 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
199b0 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  f( a[i]==0 ){.  
199c0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a        a[i] = p;.
199d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
199e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
199f0 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
19a00 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
19a10 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
19a20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
19a30 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f  .    if( i==N_SO
19a40 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20  RT_BUCKET-1 ){. 
19a50 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
19a60 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74  : To get here, t
19a70 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20  here need to be 
19a80 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  2^(N_SORT_BUCKET
19a90 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  ) .      ** elem
19aa0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
19ab0 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  t list. This is 
19ac0 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d  possible, but im
19ad0 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20  practical..     
19ae0 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73   ** Testing this
19af0 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69   line is the poi
19b00 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72  nt of global var
19b10 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73  iable.      ** s
19b20 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
19b30 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20  ort_bucket..    
19b40 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20    */.      a[i] 
19b50 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
19b60 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d  (a[i], p);.    }
19b70 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b  .  }.  p = a[0];
19b80 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f  .  for(i=1; i<N_
19b90 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b  SORT_BUCKET; i++
19ba0 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65  ){.    p = merge
19bb0 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69  _pagelist(p, a[i
19bc0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
19bd0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
19be0 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
19bf0 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
19c00 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
19c10 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
19c20 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
19c30 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
19c40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19c50 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
19c60 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
19c70 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
19c80 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
19c90 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
19ca0 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
19cb0 70 50 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20  pPager;.  PgHdr 
19cc0 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  *p;.  int rc;.. 
19cd0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
19ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19cf0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
19d00 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
19d10 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
19d20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
19d30 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
19d40 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
19d50 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
19d60 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
19d70 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
19d80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
19d90 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
19da0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
19db0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
19dc0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
19dd0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
19de0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
19df0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
19e00 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
19e10 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
19e20 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
19e30 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
19e40 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
19e50 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
19e60 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
19e70 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
19e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
19e90 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
19ea0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
19eb0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
19ec0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
19ed0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
19ee0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
19ef0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
19f00 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
19f10 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
19f20 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
19f30 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
19f40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
19f50 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
19f60 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
19f70 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
19f80 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
19f90 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
19fa0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
19fb0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
19fc0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
19fd0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
19fe0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
19ff0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1a000 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1a010 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1a020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a030 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1a040 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1a050 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1a060 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1a070 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1a080 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1a090 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1a0a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1a0b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a0c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1a0d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1a0e0 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67  pList = sort_pag
1a0f0 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20  elist(pList);.  
1a100 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1a110 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1a120 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72    assert( p->dir
1a130 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72  ty );.    p->dir
1a140 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68  ty = 0;.  }.  wh
1a150 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
1a160 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1a170 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
1a180 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
1a190 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
1a1a0 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1a1b0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1a1c0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1a1d0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
1a1e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a1f0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
1a200 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1a210 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ->fd, pPager->zF
1a220 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1a250 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20  >vfsFlags);.    
1a260 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1a270 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1a280 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1a290 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1a2a0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1a2b0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1a2c0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1a2d0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1a2e0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1a2f0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1a300 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
1a310 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
1a320 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
1a330 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
1a340 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
1a350 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
1a360 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
1a370 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
1a380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a390 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
1a3a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
1a3b0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
1a3c0 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
1a3d0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1a3e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
1a3f0 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
1a400 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
1a410 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
1a420 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
1a430 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
1a440 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20  RACE4("STORE %d 
1a450 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1a460 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1a470 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1a480 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
1a490 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1a4a0 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a  gehash(pList));.
1a4b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1a4c0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
1a4d0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1a4e0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
1a4f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a500 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
1a510 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1a520 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
1a530 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1a540 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1a550 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
1a560 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1a570 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
1a580 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1a590 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
1a5a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1a5b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1a5c0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
1a5d0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1a5e0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
1a5f0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
1a600 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
1a610 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1a620 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
1a630 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1a640 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
1a650 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
1a660 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
1a670 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69   ) return rc;.#i
1a680 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1a690 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
1a6a0 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
1a6b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1a6c0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
1a6d0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
1a6e0 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
1a6f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a700 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
1a710 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
1a720 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
1a730 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
1a740 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1a750 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
1a760 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
1a770 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
1a780 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
1a790 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
1a7a0 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
1a7b0 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
1a7c0 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
1a7d0 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23 69 66 6e   *pPager){..#ifn
1a7e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
1a7f0 56 65 72 69 66 79 20 74 68 65 20 73 61 6e 69 74  Verify the sanit
1a800 79 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 6c  y of the dirty l
1a810 69 73 74 20 77 68 65 6e 20 77 65 20 61 72 65 20  ist when we are 
1a820 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20 69 6e 20  running.  ** in 
1a830 64 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20  debugging mode. 
1a840 20 54 68 69 73 20 69 73 20 65 78 70 65 6e 73 69   This is expensi
1a850 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 0a 20 20  ve, so do not.  
1a860 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e 20 61 20  ** do this on a 
1a870 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 20 2a 2f  normal build. */
1a880 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30 3b 0a 20  .  int n1 = 0;. 
1a890 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a 20 20 50   int n2 = 0;.  P
1a8a0 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  gHdr *p;.  for(p
1a8b0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1a8c0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
1a8d0 7b 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29  { if( p->dirty )
1a8e0 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 70   n1++; }.  for(p
1a8f0 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b  =pPager->pDirty;
1a900 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1a910 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61 73 73 65  { n2++; }.  asse
1a920 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65  rt( n1==n2 );.#e
1a930 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70  ndif..  return p
1a940 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d  Pager->pDirty;.}
1a950 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
1a960 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
1a970 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
1a980 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
1a990 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
1a9a0 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
1a9b0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
1a9c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1a9d0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1a9e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a9f0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
1aa00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
1aa10 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
1aa20 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
1aa30 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
1aa40 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
1aa50 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
1aa60 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
1aa70 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
1aa80 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65  ournal..**.** Re
1aa90 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
1aaa0 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72   unable to deter
1aab0 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20  mine the status 
1aac0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
1aad0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1aae0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e  ne does not open
1aaf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ab00 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73  e to examine its
1ab10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65  .** content.  He
1ab20 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nce, the journal
1ab30 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74   might contain t
1ab40 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1ab50 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
1ab60 69 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65  ile that has bee
1ab70 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68  n deleted, and h
1ab80 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e  ence not be hot.
1ab90 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64    Or.** the head
1aba0 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
1abb0 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65  l might be zeroe
1abc0 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75  d out.  This rou
1abd0 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  tine.** does not
1abe0 20 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20   discover these 
1abf0 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68  cases of a non-h
1ac00 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20  ot journal - if 
1ac10 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
1ac20 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
1ac30 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73  s not empty this
1ac40 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73   routine assumes
1ac50 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20   it.** is hot.  
1ac60 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
1ac70 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ck() routine wil
1ac80 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
1ac90 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
1aca0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
1acb0 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e  y hot and will n
1acc0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1acd0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
1ace0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1acf0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1ad00 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1ad10 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1ad20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
1ad30 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
1ad40 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61  rn 0;.  if( !pPa
1ad50 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1ad60 73 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  s ) return 0;.  
1ad70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1ad80 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
1ad90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
1ada0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1adb0 53 29 3b 0a 20 20 69 66 28 20 72 63 3c 3d 30 20  S);.  if( rc<=0 
1adc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1add0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1ade0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
1adf0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
1ae00 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
1ae10 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
1ae20 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1ae30 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
1ae40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
1ae50 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
1ae60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
1ae70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1ae80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1ae90 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
1aea0 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
1aeb0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
1aec0 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
1aed0 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
1aee0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1aef0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1af00 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
1af10 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
1af20 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
1af30 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
1af40 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
1af50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1af60 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
1af70 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1af80 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
1af90 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
1afa0 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74  Pg = 0;..  /* It
1afb0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
1afc0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1afd0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67  n unless the pag
1afe0 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70  er object.  ** p
1aff0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61  ointed to by pPa
1b000 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74  ger has at least
1b010 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28   one free page (
1b020 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d  page with nRef==
1b030 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  0)..  */ .  asse
1b040 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73  rt(!MEMDB);.  as
1b050 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
1b060 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20  .pFirst);..  /* 
1b070 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
1b080 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
1b090 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
1b0a0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1b0b0 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
1b0c0 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
1b0d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
1b0e0 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
1b0f0 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1b100 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
1b110 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
1b120 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
1b130 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
1b140 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
1b150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b160 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
1b170 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
1b180 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
1b190 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
1b1a0 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
1b1b0 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
1b1c0 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
1b1d0 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
1b1e0 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
1b1f0 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
1b200 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
1b210 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1b220 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1b230 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
1b240 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1b250 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1b260 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1b270 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
1b280 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1b290 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1b2a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b2b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b2c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1b2d0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1b2e0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b2f0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
1b300 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20         /* If in 
1b310 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
1b320 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
1b330 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
1b340 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
1b350 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
1b360 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
1b370 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
1b380 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
1b390 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
1b3a0 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
1b3b0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
1b3c0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
1b3d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 72  e.        ** alr
1b3e0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1b3f0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1b400 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
1b410 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 20  eader is.       
1b420 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
1b430 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
1b440 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
1b450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b460 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1b470 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b480 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b490 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
1b4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b4b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1b4c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1b4d0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1b4e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b4f0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1b500 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b510 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b530 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1b540 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20  u.pFirst;.  }.. 
1b550 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1b560 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
1b570 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
1b580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b590 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
1b5a0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1b5b0 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
1b5c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1b5d0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b5e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
1b5f0 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1b600 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1b610 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b620 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1b630 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1b640 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1b650 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
1b660 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b670 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  0;.    if( rc!=S
1b680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b6a0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1b6b0 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 7c   pPg->dirty==0 |
1b6c0 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
1b6d0 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
1b6e0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
1b6f0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
1b700 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1b710 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
1b720 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
1b730 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1b740 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
1b750 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
1b760 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1b770 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
1b780 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
1b790 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1b7a0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
1b7b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
1b7c0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
1b7d0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
1b7e0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
1b7f0 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
1b800 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
1b810 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
1b820 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
1b830 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
1b840 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
1b850 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
1b860 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1b870 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
1b880 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
1b890 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1b8a0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
1b8b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1b8c0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b8d0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1b8e0 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
1b8f0 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
1b900 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
1b910 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1b920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
1b930 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
1b940 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
1b950 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
1b960 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
1b970 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
1b980 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1b990 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
1b9a0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1b9b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1b9c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b9d0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1b9e0 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EMENT./*.** This
1b9f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ba00 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
1ba10 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
1ba20 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
1ba30 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
1ba40 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
1ba50 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
1ba60 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
1ba70 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
1ba80 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1ba90 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
1baa0 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a  lite3_free()ed..
1bab0 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
1bac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bad0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
1bae0 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
1baf0 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
1bb00 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
1bb10 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
1bb20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1bb30 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
1bb40 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
1bb50 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1bb60 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eased..*/.int sq
1bb70 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
1bb80 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
1bb90 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  ){.  int nReleas
1bba0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1bbb0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
1bbc0 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20  ory released so 
1bbd0 66 61 72 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  far */.  Pager *
1bbe0 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
1bbf0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1bc00 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20  ing over pagers 
1bc10 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
1bc20 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20   *savedBusy;    
1bc30 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f   /* Saved copy o
1bc40 66 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  f the busy handl
1bc50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1bc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1bc70 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65  * Acquire the me
1bc80 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1bc90 6d 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64  mutex.  */.#ifnd
1bca0 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
1bcb0 4e 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NOOP.  sqlite3_m
1bcc0 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1bcd0 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d     /* The MEM2 m
1bce0 75 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20  utex */.  mutex 
1bcf0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1bd00 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1bd10 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
1bd20 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1bd30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
1bd40 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
1bd50 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
1bd60 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1bd70 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1bd80 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
1bd90 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
1bda0 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
1bdb0 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1bdc0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1bdd0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1bde0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1bdf0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1be00 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
1be10 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1be20 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30  TE_OK && (nReq<0
1be30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
1be40 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  eq) ){.    PgHdr
1be50 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72   *pPg;.    PgHdr
1be60 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20   *pRecycled;. . 
1be70 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e     /* Try to fin
1be80 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
1be90 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  cle that does no
1bea0 74 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63  t require a sync
1beb0 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68  (). If.    ** th
1bec0 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  is is not possib
1bed0 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61  le, find one tha
1bee0 74 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61  t does require a
1bef0 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a   sync()..    */.
1bf00 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1bf10 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
1bf20 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1bf30 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1bf40 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d  LRU));.    pPg =
1bf50 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
1bf60 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
1bf70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1bf80 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79   && (pPg->needSy
1bf90 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  nc || pPg->pPage
1bfa0 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a  r->iInUseDB) ){.
1bfb0 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
1bfc0 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20  >gfree.pNext;.  
1bfd0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67    }.    if( !pPg
1bfe0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
1bff0 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1c000 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20  st.pFirst;.     
1c010 20 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70   while( pPg && p
1c020 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1c030 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  seDB ){.        
1c040 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1c050 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  .pNext;.      }.
1c060 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c070 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
1c080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1c090 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1c0a0 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20  TATIC_LRU));..  
1c0b0 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20    /* If pPg==0, 
1c0c0 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  then the block a
1c0d0 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20  bove has failed 
1c0e0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  to find a page t
1c0f0 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65  o.    ** recycle
1c100 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
1c110 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f  eturn early - no
1c120 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20   further memory 
1c130 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1c140 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
1c150 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62      if( !pPg ) b
1c160 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65  reak;..    pPage
1c170 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c180 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67  .    assert(!pPg
1c190 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1c1a0 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1c1b0 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65  First);.    asse
1c1c0 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  rt(pPg->needSync
1c1d0 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d   || pPg==pPager-
1c1e0 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1c1f0 64 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64  d);.  .    saved
1c200 42 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  Busy = pPager->p
1c210 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
1c220 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
1c230 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  ndler = 0;.    r
1c240 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
1c250 65 28 70 50 61 67 65 72 2c 20 26 70 52 65 63 79  e(pPager, &pRecy
1c260 63 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65  cled);.    pPage
1c270 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
1c280 3d 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20  = savedBusy;.   
1c290 20 61 73 73 65 72 74 28 70 52 65 63 79 63 6c 65   assert(pRecycle
1c2a0 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51  d==pPg || rc!=SQ
1c2b0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66  LITE_OK);.    if
1c2c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c2d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76  ){.      /* We'v
1c2e0 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
1c2f0 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
1c300 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
1c310 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a  as been .      *
1c320 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
1c330 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
1c340 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
1c350 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
1c360 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
1c370 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
1c380 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
1c390 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
1c3a0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  . .      ** Remo
1c3b0 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
1c3c0 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
1c3d0 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ing..      **.  
1c3e0 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
1c3f0 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
1c400 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
1c410 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
1c420 20 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72   It .      ** pr
1c430 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
1c440 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c450 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
1c460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
1c470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
1c480 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ==pPager->pAll )
1c490 7b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  {.         pPage
1c4a0 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
1c4b0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d  NextAll;.      }
1c4c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
1c4d0 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e  r( pTmp=pPager->
1c4e0 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
1c4f0 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
1c500 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
1c510 7b 7d 0a 20 20 20 20 20 20 20 20 70 54 6d 70 2d  {}.        pTmp-
1c520 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d  >pNextAll = pPg-
1c530 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
1c540 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73   }.      nReleas
1c550 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20  ed += (.        
1c560 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b    sizeof(*pPg) +
1c570 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c580 65 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73 69  e.          + si
1c590 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
1c5a0 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
1c5b0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1c5c0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a  eof(PgHistory) .
1c5d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49        );.      I
1c5e0 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
1c5f0 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67  %p %d *\n", pPag
1c600 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
1c610 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c620 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1c630 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20  pgfree_count);. 
1c640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1c650 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
1c660 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1c670 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
1c680 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
1c690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c6a0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
1c6b0 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
1c6c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1c6d0 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
1c6e0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
1c6f0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
1c700 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
1c710 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
1c720 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  e .      ** call
1c730 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
1c740 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65  ion. Instead, se
1c750 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43  t the Pager.errC
1c760 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  ode variable..  
1c770 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
1c780 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1c790 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
1c7a0 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
1c7b0 63 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  case .      ** o
1c7c0 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72  f a shared pager
1c7d0 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70   cache) of the p
1c7e0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  ager for which t
1c7f0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  he error occured
1c800 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c810 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
1c820 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51     (rc&0xff)==SQ
1c830 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
1c840 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1c850 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
1c860 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1c870 42 55 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20  BUSY.      );.  
1c880 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c890 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1c8a0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
1c8b0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
1c8c0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1c8d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
1c8e0 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e  r the memory man
1c8f0 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e  agement flags an
1c900 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  d release the mu
1c910 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  tex.  */.  for(p
1c920 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
1c930 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
1c940 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
1c950 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
1c960 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
1c970 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c980 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
1c990 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  x);..  /* Return
1c9a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c9b0 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20  ytes released.  
1c9c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  */.  return nRel
1c9d0 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
1c9e0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1c9f0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1ca00 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  NT */../*.** Rea
1ca10 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
1ca20 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1ca30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ca40 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ca50 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67  t readDbPage(Pag
1ca60 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
1ca70 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  r *pPg, Pgno pgn
1ca80 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1ca90 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73  i64 offset;.  as
1caa0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
1cab0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1cac0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
1cad0 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
1cae0 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
1caf0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1cb00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1cb10 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1cb20 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66  _READ;.  }.  off
1cb30 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1cb40 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1cb50 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1cb60 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1cb70 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
1cb80 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
1cb90 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1cba0 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
1cbb0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cbc0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1cbd0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1cbe0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1cbf0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1cc00 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1cc10 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
1cc20 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
1cc30 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1cc40 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
1cc50 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1cc60 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20  g))[24],.       
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
1cca0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ccb0 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
1ccc0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
1ccd0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
1cce0 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
1ccf0 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
1cd00 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1cd10 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1cd20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1cd30 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1cd40 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1cd50 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
1cd60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cd70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cd80 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
1cd90 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
1cda0 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
1cdb0 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
1cdc0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
1cdd0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
1cde0 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
1cdf0 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
1ce00 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
1ce10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ce20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1ce30 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
1ce40 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
1ce50 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
1ce60 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
1ce70 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
1ce80 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
1ce90 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
1cea0 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
1ceb0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
1cec0 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
1ced0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
1cee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1cef0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
1cf00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1cf10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cf20 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d  K;.  int isHot =
1cf30 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
1cf40 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  s database is op
1cf50 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69  ened for exclusi
1cf60 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e  ve access, has n
1cf70 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
1cf80 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e   ** page referen
1cf90 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e  ces and is in an
1cfa0 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f   error-state, no
1cfb0 77 20 69 73 20 74 68 65 20 63 68 61 6e 63 65 20  w is the chance 
1cfc0 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
1cfd0 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
1cfe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1cff0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
1d000 20 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20   and treat any. 
1d010 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   ** open journal
1d020 20 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a   file as a hot-j
1d030 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ournal..  */.  i
1d040 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
1d050 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1d060 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  de && pPager->nR
1d070 65 66 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ef==0 && pPager-
1d080 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1d090 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1d0a0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
1d0b0 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20   isHot = 1;.    
1d0c0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
1d0d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
1d0e0 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
1d0f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1d100 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
1d110 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61  er is still in a
1d120 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
1d130 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54  o not proceed. T
1d140 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73  he error .  ** s
1d150 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65  tate will be cle
1d160 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69  ared at some poi
1d170 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1d180 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a   when all page .
1d190 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
1d1a0 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20  are dropped and 
1d1b0 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65  the cache can be
1d1c0 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f   discarded..  */
1d1d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d1e0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1d1f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1d200 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1d210 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1d220 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Code;.  }..  if(
1d230 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1d240 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
1d250 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c  isHot ){.    sql
1d260 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1d270 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1d280 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
1d290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d2a0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
1d2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1d2c0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1d2d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d2e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1d2f0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
1d300 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
1d310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d320 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d330 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d340 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1d350 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  OCK );.         
1d360 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d370 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d390 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d3a0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1d3b0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
1d3c0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
1d3d0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
1d3e0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
1d3f0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
1d400 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
1d410 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d420 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
1d430 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
1d440 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
1d450 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
1d460 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
1d470 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
1d480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
1d490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d4a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d4b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
1d4c0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1d4d0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1d4e0 31 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  1 || isHot ){.  
1d4f0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1d500 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1d510 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d520 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1d530 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1d540 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1d550 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1d560 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1d570 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1d580 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d590 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d5a0 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1d5b0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1d5c0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1d5d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d5e0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1d5f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1d600 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1d610 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d620 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1d630 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1d640 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1d650 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1d660 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1d670 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1d680 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1d690 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1d6a0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1d6b0 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1d6c0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1d6d0 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1d6e0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1d6f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1d700 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1d710 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1d720 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1d730 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1d740 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1d750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d760 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d770 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1d780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d790 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1d7a0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1d7b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1d7c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d7d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d7e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1d7f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1d800 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1d810 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1d820 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d830 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1d840 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1d850 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1d860 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1d870 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1d880 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1d890 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
1d8a0 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
1d8b0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1d8c0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1d8d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1d8e0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1d8f0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
1d900 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
1d910 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
1d920 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
1d930 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
1d940 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
1d950 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
1d960 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
1d970 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
1d980 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
1d990 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
1d9a0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
1d9b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d9c0 20 69 66 28 20 21 69 73 48 6f 74 20 26 26 20 70   if( !isHot && p
1d9d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d9e0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1d9f0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
1da00 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1da10 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
1da20 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
1da30 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20 20 20  _EXISTS);.      
1da40 20 20 20 20 69 66 28 20 72 65 73 3d 3d 31 20 29      if( res==1 )
1da50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1da60 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1da70 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
1da80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1da90 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1daa0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1dac0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1dad0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1dae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1daf0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1db00 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1db10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
1db20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1db30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1db40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1db50 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
1db60 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ds );.          
1db70 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
1db80 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1db90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1dba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1dbb0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y;.             
1dbc0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1dbd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1dbe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dbf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dc00 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1dc10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1dc20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
1dc30 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
1dc40 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
1dc50 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
1dc60 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1dc70 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20   rolled it back 
1dc80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1dc90 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1dca0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1dcb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1dcc0 20 49 66 20 73 71 6c 69 74 65 33 4f 73 41 63 63   If sqlite3OsAcc
1dcd0 65 73 73 28 29 20 72 65 74 75 72 6e 73 20 61 20  ess() returns a 
1dce0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 2c 20  negative value, 
1dcf0 74 68 61 74 20 6d 65 61 6e 73 20 69 74 0a 20 20  that means it.  
1dd00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69            ** fai
1dd10 6c 65 64 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c  led a memory all
1dd20 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
1dd30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1dd40 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1dd50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dd60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1dd70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1dd90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
1dda0 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  M && rc!=SQLITE_
1ddb0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  IOERR_UNLOCK .  
1ddc0 20 20 20 20 20 20 20 20 20 26 26 20 72 63 21 3d           && rc!=
1ddd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1dde0 45 4d 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b  EM .          ){
1ddf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1de00 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1de10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1de20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1de30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1de40 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1de50 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
1de60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1de70 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1de80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1de90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1dea0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1deb0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1dec0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ded0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1dee0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61   .        /* Pla
1def0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
1df00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
1df10 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
1df20 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
1df30 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
1df40 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
1df50 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
1df60 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1df70 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1df80 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 1);.        i
1df90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dfa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1dfb0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
1dfc0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1dfd0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1dfe0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
1dff0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1e000 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1e010 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20  _SHARED || .    
1e020 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1e030 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
1e040 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
1e050 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
1e060 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1e070 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
1e080 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1e090 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1e0a0 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
1e0b0 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
1e0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e0d0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
1e0e0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
1e0f0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
1e100 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
1e110 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1e120 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
1e130 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
1e140 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1e150 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1e160 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
1e170 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
1e180 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1e190 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
1e1a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
1e1b0 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
1e1c0 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
1e1d0 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
1e1e0 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
1e1f0 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
1e200 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
1e210 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
1e220 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
1e230 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
1e240 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
1e250 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
1e260 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
1e270 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
1e280 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
1e290 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
1e2a0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
1e2b0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
1e2c0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
1e2d0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
1e2e0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
1e2f0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
1e300 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1e310 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
1e320 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
1e330 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
1e340 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
1e350 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
1e360 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
1e370 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
1e380 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
1e390 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
1e3a0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
1e3b0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
1e3c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
1e3d0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
1e3e0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e3f0 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
1e400 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1e410 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1e420 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1e430 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1e440 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e450 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1e460 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1e470 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1e480 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1e490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1e4a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
1e4b0 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
1e4c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e4d0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1e4e0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
1e4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1e500 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
1e510 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1e520 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
1e530 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
1e540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e560 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e590 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
1e5a0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
1e5b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1e5c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e5d0 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
1e5e0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1e5f0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1e600 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
1e610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1e620 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1e630 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1e640 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e650 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e660 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1e670 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
1e680 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1e690 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e6a0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1e6b0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1e6c0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1e6d0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
1e6e0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
1e6f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e700 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
1e710 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
1e720 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
1e730 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
1e740 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e750 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
1e760 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1e770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1e790 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
1e7a0 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
1e7b0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
1e7c0 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
1e7d0 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
1e7e0 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
1e7f0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
1e800 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
1e810 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
1e820 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
1e830 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
1e840 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1e850 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
1e860 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
1e870 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
1e880 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1e890 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
1e8a0 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
1e8b0 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
1e8c0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1e8d0 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
1e8e0 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
1e8f0 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
1e900 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
1e910 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
1e920 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1e930 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
1e940 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
1e950 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
1e960 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1e970 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
1e980 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
1e990 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
1e9a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e9b0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
1e9c0 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
1e9d0 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
1e9e0 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
1e9f0 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
1ea00 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1ea10 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
1ea20 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
1ea30 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1ea40 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1ea50 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1ea60 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
1ea70 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
1ea80 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
1ea90 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
1eaa0 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
1eab0 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
1eac0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1ead0 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
1eae0 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
1eaf0 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
1eb00 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
1eb10 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
1eb20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
1eb30 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
1eb40 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
1eb50 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
1eb60 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
1eb70 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
1eb80 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
1eb90 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
1eba0 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
1ebb0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1ebc0 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
1ebd0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1ebe0 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
1ebf0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1ec00 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
1ec10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ec20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1ec30 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20  int nByteHdr;.. 
1ec40 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
1ec50 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66   PgHdr if any of
1ec60 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74   the four condit
1ec70 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20  ions defined .  
1ec80 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74  ** above are met
1ec90 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
1eca0 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
1ecb0 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
1ecc0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1ecd0 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42  ==0 .   || MEMDB
1ece0 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  .   || (pPager->
1ecf0 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1ed00 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64  ==0 && pPager->d
1ed10 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20  oNotSync).  ){. 
1ed20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
1ed30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ed40 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
1ed50 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
1ed60 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
1ed70 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
1ed80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1ed90 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
1eda0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
1edb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1edc0 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
1edd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ede0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1edf0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1ee00 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1ee10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1ee20 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1ee30 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20  );.    nByteHdr 
1ee40 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  = sizeof(*pPg) +
1ee50 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1ee60 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
1ee80 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1ee90 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d  tory);.    pPg =
1eea0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1eeb0 20 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20   nByteHdr );.   
1eec0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1eed0 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65    pData = sqlite
1eee0 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
1eef0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1ef00 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
1ef10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1ef20 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
1ef30 20 20 20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a         pPg = 0;.
1ef40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ef50 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
1ef60 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1ef70 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  g==0 ){.      rc
1ef80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ef90 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1efa0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
1efb0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1efc0 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64  (pPg, 0, nByteHd
1efd0 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61  r);.    pPg->pDa
1efe0 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  ta = pData;.    
1eff0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1f000 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1f010 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
1f020 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
1f030 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
1f040 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1f050 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e++;.  }else{.  
1f060 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20    /* Recycle an 
1f070 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69  existing page wi
1f080 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f  th a zero ref-co
1f090 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  unt. */.    rc =
1f0a0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1f0b0 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
1f0c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f0d0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72  _BUSY ){.      r
1f0e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1f0f0 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  _BLOCKED;.    }.
1f100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
1f120 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1f130 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1f140 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f150 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
1f160 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
1f170 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
1f180 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
1f190 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
1f1a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f1b0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1f1c0 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
1f1d0 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
1f1e0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
1f1f0 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
1f200 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1f210 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
1f220 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
1f230 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
1f240 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
1f250 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
1f260 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
1f270 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
1f280 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
1f290 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
1f2a0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
1f2b0 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
1f2c0 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
1f2d0 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
1f2e0 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
1f2f0 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
1f300 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
1f310 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
1f320 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  Read ){.    int 
1f330 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f340 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
1f350 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1f360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
1f380 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1f390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f3b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1f3c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f3d0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1f3e0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
1f3f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
1f400 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
1f410 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
1f420 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
1f430 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
1f440 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
1f450 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
1f460 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
1f470 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f480 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
1f490 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
1f4a0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
1f4b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1f4c0 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
1f4d0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1f4e0 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
1f4f0 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
1f500 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
1f510 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
1f520 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
1f530 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1f540 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
1f550 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
1f560 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
1f570 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
1f580 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
1f590 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
1f5a0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
1f5b0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
1f5c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
1f5d0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
1f5e0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
1f5f0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
1f600 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
1f610 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
1f620 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1f630 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
1f640 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1f650 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1f660 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
1f670 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
1f680 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
1f690 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
1f6a0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
1f6b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
1f6c0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
1f6d0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1f6e0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
1f6f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
1f700 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
1f710 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
1f720 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
1f730 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
1f740 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
1f750 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
1f760 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f770 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
1f780 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
1f790 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
1f7a0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
1f7b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
1f7c0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
1f7d0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
1f7e0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
1f7f0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
1f800 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
1f810 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
1f820 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
1f830 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
1f840 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
1f850 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
1f860 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
1f870 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
1f880 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
1f890 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1f8a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
1f8b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
1f8c0 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
1f8d0 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
1f8e0 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
1f8f0 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
1f900 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
1f910 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
1f920 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
1f930 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
1f940 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
1f950 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
1f960 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
1f970 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
1f980 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f990 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
1f9a0 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
1f9b0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
1f9c0 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
1f9d0 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
1f9e0 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
1f9f0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
1fa00 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
1fa10 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
1fa20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
1fa30 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
1fa40 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1fa50 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1fa60 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1fa70 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1fa80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fa90 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1faa0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1fab0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1fac0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1fad0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1fae0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1faf0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1fb00 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1fb10 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1fb20 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1fb30 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1fb40 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1fb50 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
1fb60 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
1fb70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fb80 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1fb90 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1fba0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1fbb0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
1fbc0 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
1fbd0 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
1fbe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fbf0 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
1fc00 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1fc10 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
1fc20 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
1fc30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
1fc40 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
1fc50 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
1fc60 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
1fc70 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
1fc80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fc90 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1fca0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1fcb0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
1fcc0 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
1fcd0 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
1fce0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1fcf0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
1fd00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1fd10 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
1fd20 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
1fd30 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
1fd40 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
1fd50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
1fd60 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
1fd70 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
1fd80 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
1fd90 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1fda0 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
1fdb0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1fdc0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1fdd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fde0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1fdf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1fe00 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1fe10 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
1fe20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1fe30 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1fe40 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
1fe50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
1fe60 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
1fe70 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
1fe80 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
1fe90 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68   nMax;.    int h
1fea0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1feb0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
1fec0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
1fed0 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
1fee0 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
1fef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ff00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ff10 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1ff20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
1ff30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
1ff40 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61  EMDB || pgno>pPa
1ff50 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b  ger->stmtSize );
1ff60 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1ff70 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
1ff80 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1ff90 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
1ffa0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
1ffb0 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d  Sync = 0;..    m
1ffc0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1ffd0 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
1ffe0 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
1fff0 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
20000 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
20010 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
20020 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
20030 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
20040 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
20050 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
20060 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
20070 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
20080 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20090 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
200a0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
200b0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71  rrCode;.      sq
200c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
200d0 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pPg);.      retu
200e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
200f0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
20100 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
20110 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
20120 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
20130 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
20140 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
20150 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
20160 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
20170 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
20180 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
20190 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
201a0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
201b0 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
201c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
201d0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
201e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
201f0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
20200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
20210 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
20220 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
20230 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
20240 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
20250 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
20260 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
20270 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
20280 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
20290 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
202a0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
202b0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
202c0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
202d0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
202e0 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
202f0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
20300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20310 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20320 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
20330 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
20340 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
20350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20360 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20380 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
20390 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
203a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
203b0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
203c0 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
203d0 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
203e0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
203f0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
20400 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
20410 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
20420 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
20430 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
20440 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
20450 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
20460 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
20470 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
20480 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
20490 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
204a0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
204b0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
204c0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
204d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
204e0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
204f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
20500 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
20510 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
20520 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
20530 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
20540 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
20550 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
20560 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
20570 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
20580 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
20590 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
205a0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
205b0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
205c0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
205d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
205e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
205f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20600 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
20610 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
20620 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
20630 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
20640 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
20650 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
20660 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
20670 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
20680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20690 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
206a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
206b0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
206c0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
206d0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
206e0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
206f0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
20700 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
20710 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
20720 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
20730 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
20740 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
20750 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
20760 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
20770 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63  ;.  rc = pagerAc
20780 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67  quire(pPager, pg
20790 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
207a0 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c  ntent);.  pagerL
207b0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
207c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
207d0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
207e0 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
207f0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
20800 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
20810 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
20820 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
20830 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
20840 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
20850 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
20860 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
20870 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
20880 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
20890 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
208a0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
208b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
208c0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
208d0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
208e0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
208f0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
20900 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
20910 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20920 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
20930 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
20940 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
20950 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
20960 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
20970 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
20980 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
20990 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
209a0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
209b0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
209c0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
209d0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
209e0 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pg = 0;..  asser
209f0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20a00 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
20a10 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  0 );..  pagerEnt
20a20 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
20a30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20a40 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
20a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
20a60 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
20a70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20a80 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ode );.  }else i
20a90 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20aa0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20ab0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20ac0 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  LL ){.    /* Do 
20ad0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c  nothing */.  }el
20ae0 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61  se if( (pPg = pa
20af0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
20b00 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a  r, pgno))!=0 ){.
20b10 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
20b20 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
20b30 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
20b40 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
20b50 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
20b60 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
20b70 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
20b80 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
20b90 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
20ba0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
20bb0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
20bc0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
20bd0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
20be0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
20bf0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
20c00 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
20c10 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
20c20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
20c30 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
20c40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
20c50 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
20c60 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
20c70 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d  er;..  if( pPg==
20c80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
20c90 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
20ca0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
20cb0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
20cc0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
20cd0 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
20ce0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
20cf0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
20d00 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
20d10 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
20d20 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b  nRef--;..  CHECK
20d30 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
20d40 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
20d50 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20d60 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
20d70 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
20d80 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
20d90 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
20da0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
20db0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
20dc0 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72  ef==0 ){..    lr
20dd0 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20  uListAdd(pPg);. 
20de0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
20df0 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
20e00 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
20e10 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
20e20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20e30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20e40 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
20e50 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
20e60 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
20e70 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
20e80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20e90 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
20ea0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
20eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20ec0 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
20ed0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
20ee0 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
20ef0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20f00 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
20f10 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
20f20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
20f30 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
20f40 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
20f50 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
20f60 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
20f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20f80 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
20f90 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
20fa0 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
20fb0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
20fc0 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
20fd0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20ff0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
21000 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
21010 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21020 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
21030 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
21040 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
21050 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
21060 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
21070 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
21080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
21090 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
210a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
210b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
210c0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
210d0 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
210e0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
210f0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
21100 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
21110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
21120 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
21130 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
21140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21150 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21160 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
21170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21180 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
21190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
211a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
211b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
211c0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
211d0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
211e0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
211f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
21200 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
21210 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
21220 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  ze);.  pagerEnte
21230 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
21240 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21250 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
21260 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21270 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
21280 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
21290 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
212a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
212b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
212c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
212d0 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
212e0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
212f0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
21300 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
21310 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73  URNAL);.    }els
21320 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  e{.      flags |
21330 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
21340 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
21350 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21360 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
21370 57 52 49 54 45 0a 20 20 20 20 72 63 20 3d 20 73  WRITE.    rc = s
21380 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
21390 6e 28 0a 20 20 20 20 20 20 20 20 70 56 66 73 2c  n(.        pVfs,
213a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
213b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
213c0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
213d0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
213e0 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72    );.#else.    r
213f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21400 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21410 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
21420 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
21430 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
21440 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21450 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
21460 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
21470 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
21480 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
21490 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
214a0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
214b0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
214c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
214d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
214e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
214f0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
21500 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
21510 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
21520 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
21530 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
21540 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
21550 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  ournal;.    }.  
21560 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
21570 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
21580 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
21590 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
215a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
215b0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
215c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
215d0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
215e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
215f0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
21600 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
21610 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
21620 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
21630 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
21640 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21650 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21660 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
21670 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
21680 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
21690 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
216a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
216b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
216c0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
216d0 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
216e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
216f0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
21700 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d  TE_NOMEM && rc!=
21710 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21720 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
21730 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
21740 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
21750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21770 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
21780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21790 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
217a0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
217b0 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  :.  sqlite3Bitve
217c0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
217d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
217e0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
217f0 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
21800 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
21810 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
21820 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21830 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
21840 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
21850 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
21860 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
21870 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
21880 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
21890 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
218a0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
218b0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
218c0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
218d0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
218e0 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
218f0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
21900 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21910 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
21920 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
21930 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
21940 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
21950 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
21960 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
21970 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
21980 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
21990 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
219a0 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
219b0 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
219c0 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
219d0 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
219e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
219f0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
21a00 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
21a10 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
21a20 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
21a30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
21a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
21a50 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
21a60 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
21a70 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
21a80 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
21a90 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
21aa0 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
21ab0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
21ac0 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
21ad0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
21ae0 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
21af0 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
21b00 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
21b10 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
21b20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
21b30 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
21b40 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21b50 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
21b60 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
21b70 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
21b80 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21b90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21ba0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21bb0 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
21bc0 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
21bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21be0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
21bf0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
21c00 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
21c10 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
21c20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
21c30 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
21c40 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
21c50 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
21c60 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
21c70 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
21c80 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
21c90 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
21ca0 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
21cb0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21cc0 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
21cd0 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
21ce0 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
21cf0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21d00 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
21d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
21d20 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21d30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21d40 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
21d50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21d60 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
21d70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
21d80 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
21d90 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
21da0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21db0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
21dc0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
21de0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
21df0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
21e00 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21e10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
21e40 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21e50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
21e60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e80 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
21e90 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
21ea0 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
21eb0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
21ec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
21ed0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
21ee0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
21ef0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
21f00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21f10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21f20 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65  .        pagerLe
21f30 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
21f40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
21f60 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
21f80 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
21f90 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
21fa0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21fb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
21fc0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
21fd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
21ff0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
22000 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
22010 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
22020 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22030 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
22040 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22050 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
22060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22070 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
22080 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
22090 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
220a0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
220b0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
220c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
220d0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
220e0 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
220f0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
22100 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
22110 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
22120 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
22130 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
22140 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
22150 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
22160 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
22170 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
22180 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
22190 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
221a0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
221b0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
221c0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
221d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
221e0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
221f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22200 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22210 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
22220 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
22230 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
22240 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
22250 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
22260 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
22270 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
22280 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
22290 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
222a0 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
222b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65  Size );.    page
222c0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
222d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
222e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >pInJournal ){. 
222f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22300 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
22310 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
22320 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
22330 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
22340 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
22350 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
22360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
22370 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
22380 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
22390 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
223a0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
223b0 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  _OK );.  pagerLe
223c0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
223d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
223e0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
223f0 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
22400 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
22410 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
22420 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
22430 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
22440 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
22450 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
22460 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
22470 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22480 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22490 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
224a0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
224b0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
224c0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
224d0 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
224e0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
224f0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
22500 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
22510 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
22520 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
22530 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
22540 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
22550 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
22560 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
22570 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
22580 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
22590 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
225a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
225b0 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
225c0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
225d0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
225e0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
225f0 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
22600 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22610 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70  ( pPg->pDirty->p
22620 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20 29  PrevDirty==pPg )
22630 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  ;.      pPg->pDi
22640 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
22650 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
22660 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
22670 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
22680 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22690 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
226a0 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29  y->pDirty==pPg )
226b0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
226c0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
226d0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
226e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
226f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
22700 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  ger->pDirty==pPg
22710 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
22720 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
22730 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
22740 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
22750 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
22760 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
22770 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
22780 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
22790 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
227a0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
227b0 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
227c0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
227d0 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
227e0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
227f0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
22800 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
22810 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22820 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
22830 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
22840 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
22850 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
22860 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22870 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
22880 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
22890 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
228a0 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
228b0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
228c0 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
228d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
228e0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
228f0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
22900 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
22910 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
22920 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
22930 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
22940 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22950 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
22960 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
22970 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
22980 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
22990 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
229a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
229b0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
229c0 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
229d0 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
229e0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
229f0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
22a00 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
22a10 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
22a20 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
22a30 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
22a40 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
22a50 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  or sqlite3PagerR
22a60 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
22a70 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  reset..*/.static
22a80 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
22a90 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
22aa0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47  void *pData = PG
22ab0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
22ac0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
22ad0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22ae0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22af0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
22b00 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
22b10 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22b20 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
22b30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22b40 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
22b50 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
22b60 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
22b70 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
22b80 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
22b90 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
22ba0 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
22bb0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  E(pPg);..  /* If
22bc0 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70   this page was p
22bd0 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
22be0 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
22bf0 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==1, that means
22c00 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20  .  ** we didn't 
22c10 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74  really read in t
22c20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22c30 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61  e page.  This ca
22c40 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66  n happen.  ** (f
22c50 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e  or example) when
22c60 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
22c70 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
22c80 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20  freelist.  But. 
22c90 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28   ** now we are (
22ca0 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20  perhaps) moving 
22cb0 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20  the page off of 
22cc0 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72  the freelist for
22cd0 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20  .  ** reuse and 
22ce0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
22cf0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
22d00 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e  tent so that con
22d10 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65  tent.  ** can be
22d20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
22d30 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
22d40 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64    So do the read
22d50 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69   at this.  ** ti
22d60 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  me..  */.  rc = 
22d70 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
22d80 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63  t(pPg);.  if( rc
22d90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22da0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  c;.  }..  /* Mar
22db0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
22dc0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
22dd0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
22de0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
22df0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
22e00 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
22e10 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
22e20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
22e30 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
22e40 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61  inJournal && (pa
22e50 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
22e60 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  g) || pPager->st
22e70 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
22e80 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22e90 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70  Cache = 1;.    p
22ea0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
22eb0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
22ec0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
22ed0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
22ee0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
22ef0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
22f00 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
22f10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22f20 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
22f30 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
22f40 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
22f50 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
22f60 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
22f70 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
22f80 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
22f90 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
22fa0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
22fb0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
22fc0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22fd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
22fe0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
22ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23000 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
23010 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23040 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
23050 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
23060 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
23070 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
23080 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
23090 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
230a0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  al.          && 
230b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
230c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
230d0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
230e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
230f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
23100 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
23110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23130 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
23140 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
23150 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
23160 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
23170 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
23180 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
23190 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
231a0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
231b0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
231c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
231d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
231e0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
231f0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
23200 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
23210 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
23220 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
23230 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
23240 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
23250 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
23260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
23270 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
23280 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
23290 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
232a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
232b0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
232c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
232d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
232e0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
232f0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
23300 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23310 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
23320 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
23330 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23340 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
23350 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
23360 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
23370 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
23380 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rig = sqlite3_ma
23390 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
233a0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
233b0 20 20 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e      if( !pHist->
233c0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
233d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
233e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
233f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23400 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
23410 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
23420 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
23430 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
23440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23450 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
23460 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
23470 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
23480 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
23490 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
234a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
234b0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
234c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
234d0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
234e0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
234f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
23500 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
23510 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
23520 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
23530 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
23540 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
23550 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
23560 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
23570 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
23580 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
23590 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
235a0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
235b0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
235c0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
235d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
235e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
235f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23600 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
23610 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23630 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23640 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
23650 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
23660 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
23670 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
236a0 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
236b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
236c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
236d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
236e0 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+4;.          
236f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
23700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23710 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23720 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
23730 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
23740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
23750 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
23760 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
23770 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
23780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23790 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
237a0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
237b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
237c0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
237d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
237e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
237f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
23800 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
23810 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
23820 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
23830 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  t);.          PA
23840 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
23850 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
23860 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
23870 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
23880 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
23890 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
238a0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
238b0 63 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  c, pager_pagehas
238c0 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
238d0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
238e0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
238f0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
23900 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
23910 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
23920 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
23930 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
23940 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
23950 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23960 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23980 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
23990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
239a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
239b0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
239c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
239d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
239e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
239f0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
23a00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
23a10 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
23a20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
23a30 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
23a40 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
23a50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23a60 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
23a70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23a80 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
23a90 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
23aa0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
23ab0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23ad0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
23ae0 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
23af0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
23b00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
23b10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
23b20 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
23b30 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
23b40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23b50 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23b60 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
23b70 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
23b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23b90 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
23ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
23bb0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
23bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23bd0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
23be0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
23bf0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
23c00 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
23c10 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
23c20 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
23c30 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
23c40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
23c50 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
23c60 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
23c70 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
23c80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
23c90 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
23ca0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
23cb0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
23cc0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
23cd0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
23ce0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
23cf0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
23d00 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
23d10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20  ->stmtInUse .   
23d20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74    && !pageInStat
23d30 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20  ement(pPg) .    
23d40 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
23d50 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
23d60 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
23d70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
23d80 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
23d90 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
23da0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23db0 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
23dc0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
23dd0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
23de0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
23df0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
23e00 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
23e10 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
23e20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
23e30 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  tmt = sqlite3_ma
23e40 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
23e50 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
23e60 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
23e70 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
23e80 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
23e90 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
23ea0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
23eb0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
23ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
23ed0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
23ee0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
23ef0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
23f00 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
23f10 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
23f20 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
23f30 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
23f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
23f50 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
23f60 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
23f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23f80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
23f90 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
23fa0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
23fb0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
23fc0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
23fd0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74  2bits(pPager->st
23fe0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
23ff0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
24000 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24010 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
24020 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
24030 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
24040 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
24050 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
24060 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+4);.        }.
24070 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
24080 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
24090 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
240a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
240b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
240c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
240d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
240e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
240f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24100 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
24110 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
24120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
24130 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
24140 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
24150 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
24160 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
24170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24180 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
24190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
241a0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
241b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
241c0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
241d0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
241e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
241f0 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
24200 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24210 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
24220 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
24230 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
24240 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
24250 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
24260 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
24270 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
24280 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
24290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
242a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
242b0 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
242c0 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
242d0 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
242e0 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
242f0 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
24300 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
24310 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
24320 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
24330 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
24340 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
24350 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
24360 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
24370 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
24380 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
24390 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
243a0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
243b0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
243c0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
243d0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
243e0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
243f0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
24400 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
24410 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
24420 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
24430 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
24440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
24450 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24470 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
24480 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
24490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
244a0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
244b0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
244c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
244d0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
244e0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
244f0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
24500 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
24510 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72  eSize);..  pager
24520 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
24530 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
24540 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
24550 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
24560 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
24570 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
24580 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
24590 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
245a0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
245b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
245c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
245d0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
245e0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
245f0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
24600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24610 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
24620 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
24630 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
24640 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
24650 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
24660 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
24670 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
24680 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
24690 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
246a0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
246b0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
246c0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
246d0 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
246e0 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
246f0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
24700 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24710 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
24720 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
24730 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
24740 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
24750 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
24760 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
24770 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
24780 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
24790 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
247a0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
247b0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
247c0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
247d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
247e0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
247f0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
24800 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
24810 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
24820 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
24830 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
24840 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
24850 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
24860 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
24870 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
24880 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
24890 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
248a0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
248b0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
248c0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
248d0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
248e0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
248f0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
24900 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
24910 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
24920 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
24930 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24940 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
24950 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
24960 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
24970 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
24980 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
24990 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
249a0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
249b0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
249c0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
249d0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
249e0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
249f0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
24a00 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
24a10 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
24a20 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
24a30 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
24a40 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
24a50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
24a60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24a70 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24a80 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
24a90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
24aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24ab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
24ac0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
24ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24ae0 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
24af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b00 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
24b10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24b20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24b30 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
24b40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
24b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24b60 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
24b70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
24b80 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
24b90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24ba0 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29  Page->needSync )
24bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
24bc0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
24bd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24be0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
24bf0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
24c00 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
24c10 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
24c20 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
24c30 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
24c40 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
24c50 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
24c60 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
24c70 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
24c80 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
24c90 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
24ca0 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
24cb0 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
24cc0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
24cd0 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
24ce0 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
24cf0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
24d00 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
24d10 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
24d20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
24d30 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
24d40 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
24d50 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  c ){.      for(i
24d60 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
24d70 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29   needSync; ii++)
24d80 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
24d90 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
24da0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
24db0 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
24dc0 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65  f( pPage ) pPage
24dd0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
24de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
24df0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
24e00 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
24e10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24e20 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
24e30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
24e40 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
24e50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
24e60 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
24e70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  age);.  }.  page
24e80 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
24e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24ea0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
24eb0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
24ec0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
24ed0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
24ee0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
24ef0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24f00 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
24f10 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
24f20 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
24f30 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
24f40 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
24f50 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
24f60 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
24f70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24f80 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
24f90 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
24fa0 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  rty;.}.#endif../
24fb0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
24fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
24fd0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
24fe0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
24ff0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
25000 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
25010 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
25020 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
25030 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
25040 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
25050 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
25060 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
25070 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
25080 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
25090 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
250a0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
250b0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
250c0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
250d0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
250e0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
250f0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
25100 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
25110 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
25120 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
25130 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
25140 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
25150 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
25160 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
25170 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
25180 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
25190 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
251a0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
251b0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
251c0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
251d0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
251e0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
251f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25200 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
25210 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
25220 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
25230 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
25240 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25250 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
25260 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
25270 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
25280 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
25290 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
252a0 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
252b0 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
252c0 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
252d0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
252e0 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
252f0 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
25300 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
25310 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
25320 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
25330 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
25340 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
25350 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
25360 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
25370 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
25380 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
25390 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
253a0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
253b0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
253c0 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
253d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
253e0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
253f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
25400 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
25410 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
25420 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
25430 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
25440 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
25450 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
25460 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
25470 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
25480 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
25490 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
254a0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
254b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
254c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
254d0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
254e0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
254f0 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
25500 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
25510 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
25520 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
25530 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
25540 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
25550 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
25560 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
25570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25580 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
25590 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
255a0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
255b0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
255c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
255d0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
255e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
255f0 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
25600 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
25610 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
25620 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
25630 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
25640 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
25650 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
25660 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
25670 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
25680 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
25690 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
256a0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
256b0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
256c0 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
256d0 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
256e0 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
256f0 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
25700 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
25710 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
25720 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
25730 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
25740 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
25750 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
25760 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
25770 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
25780 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
25790 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
257a0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
257b0 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
257c0 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
257d0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
257e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
257f0 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
25800 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
25810 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
25820 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
25830 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
25840 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
25850 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
25860 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
25870 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
25880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
25890 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
258a0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
258b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
258c0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
258d0 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
258e0 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
258f0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
25900 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
25910 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
25920 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
25930 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
25940 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
25950 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
25960 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
25970 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
25980 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
25990 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
259a0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
259b0 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
259c0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
259d0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
259e0 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
259f0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
25a00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
25a10 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
25a20 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
25a30 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
25a40 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
25a50 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
25a60 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
25a70 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
25a80 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
25a90 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
25aa0 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
25ab0 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
25ac0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
25ad0 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
25ae0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
25af0 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
25b00 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
25b10 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
25b20 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72  pPager;..  pager
25b30 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
25b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25b50 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
25b60 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
25b70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
25b80 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
25b90 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20   or DontWrite() 
25ba0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
25bb0 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67  on.  ** this pag
25bc0 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73  e (DontWrite() s
25bd0 65 74 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f  ets the alwaysRo
25be0 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68  llback flag), th
25bf0 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  en this.  ** fun
25c00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25c10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
25c30 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61  ==0 || pPg->alwa
25c40 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
25c50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
25c60 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 61 67 65  back ){.    page
25c70 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
25c80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25c90 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
25ca0 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20   );    /* For a 
25cb0 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a  memdb, pPager->j
25cc0 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c  ournalOpen is al
25cd0 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65  ways 0 */..#ifde
25ce0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
25cf0 44 45 4c 45 54 45 0a 20 20 69 66 28 20 70 50 67  DELETE.  if( pPg
25d00 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
25d10 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20  int)pPg->pgno > 
25d20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25d30 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
25d40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25d50 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c  /* If SECURE_DEL
25d60 45 54 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ETE is disabled,
25d70 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
25d80 6f 20 77 61 79 20 74 68 61 74 20 74 68 69 73 0a  o way that this.
25d90 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e    ** routine can
25da0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
25db0 70 61 67 65 20 66 6f 72 20 77 68 69 63 68 20 73  page for which s
25dc0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
25dd0 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20  rite().  ** has 
25de0 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
25df0 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  sly called durin
25e00 67 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  g the same trans
25e10 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64  action..  ** And
25e20 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20   if DontWrite() 
25e30 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62  has previously b
25e40 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25e50 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
25e60 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
25e70 65 20 6d 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e met..  */.  as
25e80 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f  sert( !pPg->inJo
25e90 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
25ea0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
25eb0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
25ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
25ed0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
25ee0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  0 );.  sqlite3Bi
25ef0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
25f00 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
25f10 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69  >pgno);.  pPg->i
25f20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
25f30 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
25f40 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
25f50 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
25f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25f70 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50  ->stmtSize >= pP
25f80 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
25f90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
25fa0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
25fb0 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70  >pInStmt, pPg->p
25fc0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45  gno);.  }.  PAGE
25fd0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
25fe0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
25ff0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
26000 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
26010 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
26020 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
26030 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
26040 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c  >pgno)).  pagerL
26050 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
26060 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
26070 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
26080 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
26090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
260a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
260b0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
260c0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
260d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
260e0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
260f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
26100 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
26110 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
26120 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
26130 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
26140 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26150 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
26160 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26170 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f  untDone ){.    /
26180 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
26190 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
261a0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
261b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
261c0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
261d0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
261e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
261f0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
26200 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b  if( !isDirect ){
26210 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26220 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26230 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  gHdr);.      if(
26240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26260 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
26270 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  dr);.        ret
26280 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
26290 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
262a0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
262b0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
262c0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
262d0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
262e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
262f0 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
26300 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
26310 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
26320 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
26330 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
26340 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  ((char*)PGHDR_TO
26350 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32  _DATA(pPgHdr))+2
26360 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
26370 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44  r);..    if( isD
26380 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d  irect && pPager-
26390 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
263a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  .      const voi
263b0 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f  d *zBuf = PGHDR_
263c0 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b  TO_DATA(pPgHdr);
263d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
263e0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
263f0 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
26400 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
26410 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
26420 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
26430 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
26440 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26450 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
26460 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
26470 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
26480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
264a0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
264b0 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
264c0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
264d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
264e0 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
264f0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
26500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
26510 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
26520 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
26530 67 73 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  gs);.  pagerLeav
26540 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
26550 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26560 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
26570 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
26580 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
26590 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
265a0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
265b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
265c0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
265d0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
265e0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
265f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
26600 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
26610 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
26620 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
26630 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
26640 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
26650 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
26660 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
26670 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
26680 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
26690 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
266a0 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
266b0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
266c0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
266d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
266e0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
266f0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
26700 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
26710 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
26720 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
26730 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26740 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
26750 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
26760 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
26770 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
26780 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
26790 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
267a0 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
267b0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
267c0 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
267d0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
267e0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
267f0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
26800 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
26810 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
26820 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
26830 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
26840 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
26850 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
26860 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a  databases)..**.*
26870 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
26880 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
26890 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
268a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
268b0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
268c0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
268d0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
268e0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
268f0 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
26900 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
26910 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
26920 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
26930 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
26940 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
26950 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
26960 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
26970 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
26980 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
26990 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f  r *pPager, .  co
269a0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
269b0 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e  r, .  Pgno nTrun
269c0 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a  c,.  int noSync.
269d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
269e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
269f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26a00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
26a10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
26a20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63   }..  /* If no c
26a30 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
26a40 20 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65   made, we can le
26a50 61 76 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ave the transact
26a60 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a  ion early..  */.
26a70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
26a80 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20  Modified==0 &&. 
26a90 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
26aa0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
26ab0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
26ac0 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20  ELETE ||.       
26ad0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
26ae0 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a  siveMode!=0) ){.
26af0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26b00 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
26b10 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 || pPager->jou
26b20 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
26b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26b40 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
26b50 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53  RTRACE4("DATABAS
26b60 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
26b70 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
26b80 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
26b90 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
26ba0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
26bb0 6e 63 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  nc);.  pagerEnte
26bc0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  r(pPager);..  /*
26bd0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
26be0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
26bf0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
26c00 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
26c10 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
26c20 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
26c30 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
26c40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
26c50 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
26c60 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
26c70 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
26c80 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
26c90 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
26ca0 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53   *pPg;..#ifdef S
26cb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
26cc0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a  MIC_WRITE.    /*
26cd0 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   The atomic-writ
26ce0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
26cf0 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  an be used if al
26d00 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  l of the.    ** 
26d10 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
26d20 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ue:.    **.    *
26d30 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d  *    + The file-
26d40 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
26d50 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
26d60 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
26d70 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
26d80 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
26d90 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  ze, and.    **  
26da0 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    + This commit 
26db0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
26dc0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
26dd0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
26de0 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79   **    + Exactly
26df0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
26e00 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
26e10 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
26e20 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
26e30 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
26e40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
26e50 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74   be used, then t
26e60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26e70 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a  will never.    *
26e80 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72  * be created for
26e90 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
26ea0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  n..    */.    in
26eb0 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  t useAtomicWrite
26ec0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d   = (.        !zM
26ed0 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20  aster && .      
26ee0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
26ef0 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20  lOpen &&.       
26f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26f10 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
26f20 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
26f30 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d          nTrunc==
26f40 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 30  0 && .        (0
26f50 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ==pPager->pDirty
26f60 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70   || 0==pPager->p
26f70 44 69 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20  Dirty->pDirty). 
26f80 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
26f90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26fa0 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
26fb0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
26fc0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26fd0 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75  OFF );.    if( u
26fe0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b  seAtomicWrite ){
26ff0 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
27000 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
27010 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
27020 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ile. */.      in
27030 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  t offset = pPage
27040 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
27050 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
27060 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73  agic);.      ass
27070 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63  ert(pPager->nRec
27080 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ==1);.      rc =
27090 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
270a0 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74  ger->jfd, offset
270b0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
270c0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
270d0 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68  e the db file ch
270e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68  ange counter. Th
270f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
27100 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20   will modify.   
27110 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d     ** the in-mem
27120 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
27130 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  on of page 1 to 
27140 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
27150 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  ted.      ** cha
27160 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
27170 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
27180 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  1 directly to th
27190 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
271a0 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73   ** file. Becaus
271b0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
271c0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f  write property o
271d0 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
271e0 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a  system, .      *
271f0 2a 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  * this is safe..
27200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27230 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
27240 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
27250 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
27260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27270 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
27280 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
27290 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
272a0 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63    if( !useAtomic
272b0 57 72 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c  Write && rc==SQL
272c0 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a  ITE_OK ).#endif.
272d0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
272e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
272f0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
27300 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
27310 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
27320 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
27330 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
27340 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
27350 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
27360 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
27370 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
27380 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
27390 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
273a0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
273b0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
273c0 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
273d0 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
273e0 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
273f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
27400 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
27410 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
27420 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
27430 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27440 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
27450 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27460 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
27470 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
27480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27490 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
274a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69  nc_exit;.      i
274b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
274c0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
274d0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
274e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
274f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
27500 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 72 75          if( nTru
27510 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
27520 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
27530 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
27540 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
27550 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
27560 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
27570 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
27580 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
27590 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
275a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
275b0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
275c0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
275d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
275e0 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
275f0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
27600 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
27610 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  er);.          f
27620 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
27630 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
27640 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
27650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
27660 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
27670 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
27680 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
27690 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
276a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
276b0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
276c0 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
276d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
276e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
276f0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
27700 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27710 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27720 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
27730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
27740 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
27750 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27770 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
27780 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27790 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20           } .    
277a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
277b0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
277c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
277d0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
277e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
277f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27800 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
27810 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
27820 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
27830 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
27840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27850 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27860 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
27870 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27880 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
27890 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
278a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
278b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
278c0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
278d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
278e0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
278f0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
27900 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
27910 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
27920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27930 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
27940 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
27950 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
27960 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
27970 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
27980 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
27990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
279a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
279b0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
279c0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
279d0 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
279e0 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
279f0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
27a00 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
27a10 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
27a20 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
27a30 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
27a40 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
27a50 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
27a60 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
27a70 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
27a80 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
27a90 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
27aa0 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
27ab0 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
27ac0 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
27ad0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
27ae0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
27af0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
27b00 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
27b10 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
27b20 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
27b30 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
27b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27b50 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27b60 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
27b70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
27b80 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
27b90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
27ba0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27bb0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
27bc0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
27bd0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27be0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
27bf0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
27c00 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
27c10 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
27c20 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
27c30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
27c40 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
27c50 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
27c60 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
27c70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27c80 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
27c90 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
27ca0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
27cb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27cc0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
27cd0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
27ce0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
27cf0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
27d00 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
27d10 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
27d20 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
27d30 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
27d40 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
27d50 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
27d60 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
27d70 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
27d80 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
27d90 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
27da0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
27db0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
27dc0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
27dd0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
27de0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27e00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
27e10 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
27e20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
27e30 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
27e40 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
27e50 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
27e60 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
27e70 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
27e80 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
27e90 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
27ea0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
27eb0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
27ec0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
27ed0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
27ee0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27ef0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
27f00 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
27f10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
27f20 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
27f30 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
27f40 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
27f50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
27f60 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
27f70 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
27f80 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
27f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27fa0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OR;.  }.  if( pP
27fb0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
27fc0 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28  ==0 &&.        (
27fd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27fe0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
27ff0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
28000 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28010 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28020 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65  !=0) ){.    asse
28030 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
28040 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
28050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
28060 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
28070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28080 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28090 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52  ager);.  PAGERTR
280a0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
280b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
280c0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
280d0 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
280e0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
280f0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
28100 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
28110 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
28120 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
28130 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
28140 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
28150 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
28160 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
28170 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
28180 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
28190 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
281a0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
281b0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
281c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
281d0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
281e0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
281f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
28200 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
28210 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
28220 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
28230 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
28240 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
28250 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
28260 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
28270 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
28280 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
28290 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
282a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
282b0 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
282c0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
282d0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
282e0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
282f0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
28300 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
28310 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
28320 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
28330 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
28340 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
28350 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
28360 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
28370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28390 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
283a0 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
283b0 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
283c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
283d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
283e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
283f0 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  aster);.  rc = p
28400 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28410 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
28420 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28440 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
28450 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
28460 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
28470 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
28480 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
28490 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
284a0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
284b0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
284c0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
284d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
284e0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
284f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
28500 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
28510 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
28520 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
28530 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
28540 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
28550 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
28560 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
28570 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
28580 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
28590 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
285a0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
285b0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
285c0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
285d0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
285e0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
285f0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
28600 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
28610 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
28620 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
28630 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
28640 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
28650 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
28660 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
28670 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28680 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
28690 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
286a0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
286b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
286c0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
286d0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
286e0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
286f0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
28700 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
28710 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
28720 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
28730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
28740 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
28750 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
28760 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
28770 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
28780 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
28790 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
287a0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
287b0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
287c0 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
287d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
287e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
287f0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
28800 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
28810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
28820 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
28830 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
28840 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
28850 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
28860 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
28870 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28880 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
28890 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
288a0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
288b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
288c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
288d0 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
288e0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
288f0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
28900 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28920 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
28930 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
28940 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
28950 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
28960 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
28970 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28980 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
28990 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
289a0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
289b0 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
289c0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
289d0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
289e0 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
289f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
28a00 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28a10 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
28a20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
28a30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
28a40 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
28a50 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
28a60 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
28a70 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
28a80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28a90 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
28aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
28ab0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
28ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28ad0 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45  K;.  }..  pagerE
28ae0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
28af0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
28b00 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
28b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
28b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
28b30 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
28b40 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
28b50 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
28b60 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28b70 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
28b80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
28b90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
28ba0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
28bb0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
28bc0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
28bd0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
28be0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
28bf0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
28c00 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
28c10 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
28c20 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
28c30 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
28c40 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
28c50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
28c60 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
28c70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
28c80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28c90 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28ca0 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  0);.    rc2 = pa
28cb0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
28cc0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
28cd0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
28ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28d00 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
28d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28d20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
28d30 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
28d40 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
28d50 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
28d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28d70 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
28d80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
28d90 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
28da0 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
28db0 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
28dc0 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
28dd0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
28de0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
28df0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
28e00 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
28e10 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tent..  */.  rc 
28e20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
28e30 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
28e40 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28e60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28e70 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
28e80 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
28e90 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
28ea0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
28eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28ec0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
28ed0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
28ee0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
28ef0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
28f00 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28f10 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
28f20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28f30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
28f40 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28f50 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
28f60 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
28f70 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
28f80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
28f90 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
28fa0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
28fb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
28fc0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
28fd0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
28fe0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
28ff0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
29000 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
29010 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
29020 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
29030 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
29040 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
29050 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
29060 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
29070 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
29080 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
29090 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
290a0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
290b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
290c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
290d0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
290e0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
290f0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
29100 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
29110 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
29120 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
29130 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
29140 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
29150 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
29160 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
29170 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
29180 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
29190 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
291a0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
291b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
291c0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
291d0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
291e0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
291f0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
29200 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29210 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
29220 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
29230 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
29240 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
29250 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
29260 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74  ic int pagerStmt
29270 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
29280 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
29290 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
292a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
292b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
292c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
292d0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
292e0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
292f0 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
29300 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
29310 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
29320 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
29330 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
29340 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29350 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
29360 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
29370 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
29380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29390 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
293a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
293b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
293c0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
293d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
293e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
293f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
29400 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
29410 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
29420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29430 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
29440 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
29450 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69  Stmt = sqlite3Bi
29460 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
29470 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
29480 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29490 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
294a0 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  pInStmt==0 ){.  
294b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
294c0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
294d0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
294e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
294f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
29500 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
29510 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
29520 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
29530 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
29540 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
29550 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
29560 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
29570 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
29580 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
29590 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
295a0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
295b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
295c0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
295d0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74  pVfs, pPager->st
295e0 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d  fd, pPager->zStm
295f0 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20  tJrnl,.         
29600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29610 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
29620 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
29630 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29640 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
29650 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  n_failed;.    }.
29660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
29670 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
29680 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
29690 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
296a0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
296b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
296c0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
296d0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
296e0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
296f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
29700 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
29710 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
29720 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
29730 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
29740 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
29750 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
29760 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
29770 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
29780 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29790 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
297a0 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
297b0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
297c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
297d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
297e0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
297f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
29800 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
29810 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29820 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
29830 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
29840 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
29850 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
29860 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
29870 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
29880 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
29890 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
298a0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
298b0 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
298c0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
298d0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
298e0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
298f0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
29900 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
29910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
29920 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
29930 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
29940 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
29950 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
29960 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
29970 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
29980 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
29990 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
299a0 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
299b0 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
299c0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
299d0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
299e0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
299f0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
29a00 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
29a10 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
29a20 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
29a40 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
29a50 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
29a60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
29a70 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
29a80 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
29a90 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
29aa0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
29ab0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
29ac0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
29ad0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
29ae0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
29af0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
29b00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29b10 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
29b20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
29b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
29b40 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
29b50 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
29b60 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
29b70 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
29b80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
29b90 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
29ba0 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
29bb0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
29bc0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
29bd0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
29be0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
29bf0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
29c00 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
29c10 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
29c20 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
29c30 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
29c40 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
29c50 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
29c60 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29c70 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
29c80 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
29c90 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
29ca0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
29cb0 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
29cc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
29cd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29ce0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
29cf0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
29d00 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
29d10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29d20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29d30 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
29d40 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
29d50 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
29d60 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
29d70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29d80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
29d90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29da0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
29db0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
29dc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
29dd0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
29de0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29e00 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
29e10 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
29e20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29e30 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
29e40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29e50 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
29e60 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
29e70 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
29e80 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29e90 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
29ea0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29eb0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
29ec0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
29ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
29ee0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
29ef0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
29f00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
29f10 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
29f20 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
29f30 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29f40 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
29f50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
29f60 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
29f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
29f80 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
29f90 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
29fa0 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
29fb0 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
29fc0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
29fd0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
29fe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
29ff0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
2a000 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a010 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2a020 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
2a030 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
2a040 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
2a050 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
2a060 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2a070 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
2a080 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2a090 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
2a0a0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
2a0b0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2a0c0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2a0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
2a0e0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2a0f0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2a100 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
2a110 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2a120 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
2a130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a140 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
2a150 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
2a160 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
2a170 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
2a180 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
2a190 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
2a1a0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
2a1b0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
2a1c0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2a1d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2a1e0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
2a1f0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2a200 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
2a210 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
2a220 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
2a230 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2a240 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
2a250 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
2a260 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
2a270 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
2a280 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
2a290 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
2a2a0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
2a2b0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
2a2c0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
2a2d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
2a2e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a2f0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2a300 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
2a310 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
2a320 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
2a330 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
2a340 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
2a350 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
2a360 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
2a370 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
2a380 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
2a390 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
2a3a0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
2a3b0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
2a3c0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
2a3d0 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
2a3e0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
2a3f0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
2a400 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2a410 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
2a420 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
2a430 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
2a440 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
2a450 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
2a460 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
2a470 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
2a480 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
2a490 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
2a4a0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
2a4b0 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
2a4c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
2a4d0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
2a4e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2a4f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2a500 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
2a510 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
2a520 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
2a530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a540 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
2a550 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
2a560 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
2a570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2a580 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
2a590 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
2a5a0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
2a5b0 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
2a5c0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
2a5d0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
2a5e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
2a5f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
2a600 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
2a610 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
2a620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a630 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
2a640 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
2a650 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
2a660 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
2a670 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
2a680 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
2a690 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
2a6a0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
2a6b0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
2a6c0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
2a6d0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
2a6e0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
2a6f0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
2a700 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
2a710 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2a720 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
2a730 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
2a740 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
2a750 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
2a760 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2a770 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
2a780 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
2a790 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
2a7a0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
2a7b0 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
2a7c0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
2a7d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
2a7e0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
2a7f0 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
2a800 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
2a810 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
2a820 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
2a830 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
2a840 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
2a850 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
2a860 69 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  its hash-chain *
2a870 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
2a880 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
2a890 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2a8a0 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
2a8b0 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
2a8c0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
2a8d0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
2a8e0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
2a8f0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
2a900 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
2a910 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
2a920 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
2a930 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
2a940 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
2a950 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
2a960 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
2a970 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
2a980 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  /.  pPg->needSyn
2a990 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20  c = 0;.  pPgOld 
2a9a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2a9b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
2a9c0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
2a9d0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
2a9e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
2a9f0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
2aa00 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
2aa10 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
2aa20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
2aa30 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67  ->needSync = pPg
2aa40 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20  Old->needSync;. 
2aa50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
2aa60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2aa70 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   }.  pPg->inJour
2aa80 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
2aa90 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2aaa0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
2aab0 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
2aac0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2aad0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
2aae0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
2aaf0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
2ab00 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
2ab10 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
2ab20 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
2ab30 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
2ab40 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
2ab50 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2ab60 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
2ab70 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2ab80 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
2ab90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
2aba0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
2abb0 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
2abc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
2abd0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2abe0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
2abf0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
2ac00 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
2ac10 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
2ac20 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
2ac30 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
2ac40 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2ac50 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
2ac60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
2ac70 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
2ac80 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
2ac90 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
2aca0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
2acb0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
2acc0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
2acd0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
2ace0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
2acf0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
2ad00 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
2ad10 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
2ad20 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
2ad30 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2ad40 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
2ad50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2ad60 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
2ad70 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
2ad80 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
2ad90 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
2ada0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2adb0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
2adc0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
2add0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
2ade0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2adf0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2ae00 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69   load the page i
2ae10 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63  nto the page-cac
2ae20 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20  he fails, (due. 
2ae30 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f     ** to a mallo
2ae40 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72  c() or IO failur
2ae50 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69  e), clear the bi
2ae60 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72  t in the pInJour
2ae70 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72  nal[].    ** arr
2ae80 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
2ae90 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f  f the page is lo
2aea0 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e  aded and written
2aeb0 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a   again in.    **
2aec0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2aed0 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69  n, it may be wri
2aee0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2aef0 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
2af00 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79  .    ** it is sy
2af10 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f  nced into the jo
2af20 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
2af30 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64   way, it may end
2af40 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68   up in.    ** th
2af50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
2af60 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69  wice, but that i
2af70 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e  s not a problem.
2af80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2af90 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2afa0 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
2afb0 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
2afc0 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
2afd0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
2afe0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
2aff0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
2b000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2b010 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  rc;.    PgHdr *p
2b020 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
2b030 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
2b040 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
2b050 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2b060 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
2b070 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
2b080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2b0a0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
2b0b0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65  urnal && (int)ne
2b0c0 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67  edSyncPgno<=pPag
2b0d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
2b0e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b0f0 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
2b100 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2b110 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a   needSyncPgno);.
2b120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
2b130 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
2b140 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2b150 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
2b160 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2b170 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
2b180 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2b190 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
2b1a0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
2b1b0 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
2b1c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2b1d0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
2b1e0 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  }..  pagerLeave(
2b1f0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
2b200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2b210 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
2b220 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2b230 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
2b240 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2b250 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
2b260 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
2b270 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
2b280 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
2b290 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
2b2a0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2b2b0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
2b2c0 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
2b2d0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
2b2e0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
2b2f0 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
2b300 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
2b310 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
2b320 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
2b330 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2b340 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2b350 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2b360 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
2b370 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
2b380 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
2b390 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
2b3a0 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
2b3b0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
2b3c0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
2b3d0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
2b3e0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2b3f0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
2b400 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
2b410 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
2b420 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2b430 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
2b440 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
2b450 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
2b460 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
2b470 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
2b480 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
2b490 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
2b4a0 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
2b4b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b4c0 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
2b4d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2b4e0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
2b4f0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2b500 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
2b510 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
2b520 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
2b530 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
2b540 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
2b550 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
2b560 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
2b570 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b580 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
2b590 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2b5a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b5b0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
2b5c0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2b5d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2b5e0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2b5f0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2b600 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
2b610 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2b620 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2b630 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
2b640 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2b650 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
2b660 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
2b670 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b680 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2b690 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2b6a0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
2b6b0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
2b6c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
2b6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2b6e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
2b6f0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
2b700 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
2b710 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
2b720 20 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   of PAGER_JOURNA
2b730 4c 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  LMODE_QUERY, PAG
2b740 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2b750 45 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47  ELETE or .** PAG
2b760 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2b770 45 52 53 49 53 54 2e 20 49 66 20 74 68 65 20 70  ERSIST. If the p
2b780 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2b790 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
2b7a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
2b7b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
2b7c0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
2b7d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2b7e0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
2b7f0 65 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  er PAGER_JOURNAL
2b800 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a  MODE_DELETE or.*
2b810 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
2b820 4f 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e 64  ODE_PERSIST, ind
2b830 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
2b840 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
2b850 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61  dated).** journa
2b860 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
2b870 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2b880 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
2b890 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
2b8a0 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
2b8b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b8c0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
2b8d0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2b8e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b8f0 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
2b900 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2b910 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b920 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
2b930 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2b940 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b950 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
2b960 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2b970 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
2b980 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2b990 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2b9a0 54 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4a  TE>=0 && PAGER_J
2b9b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2b9c0 53 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  ST>=0 );.  if( e
2b9d0 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Mode>=0 ){.    p
2b9e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b9f0 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
2ba00 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
2ba10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2ba20 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  e;.}..#ifdef SQL
2ba30 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
2ba40 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
2ba50 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
2ba60 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
2ba70 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
2ba80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2ba90 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  Refdump(Pager *p
2baa0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
2bab0 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
2bac0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
2bad0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
2bae0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
2baf0 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
2bb00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
2bb10 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2bb20 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70  PAGE %3d addr=%p
2bb30 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
2bb40 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
2bb50 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
2bb60 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
2bb70 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65    }.}.#endif..#e
2bb80 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2bb90 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.